2016-05-24 1 views
0

でランタイムエラーをトリガしません。その値を引数として渡したときにラップします。print()。誰もがなぜランタイムエラーを引き起こさず、安全にnilを印刷するのか説明してください。印刷が私の<code>numberOfRooms</code>変数が<code>nil</code>値を持っていると私は強制を使用していないとして、私は以下のコードを持っており、それが正常に動作しますが、私はクラッシュするライン<code>print(john.residence!.numberOfRooms)</code>を期待していたスウィフト

class Person { 
    var residence: Residence? 
} 

class Residence { 
    var numberOfRooms: Int? 
} 

let john = Person() 

john.residence = Residence() 

print(john.residence!.numberOfRooms) 
+0

Max。物事をクリアするだけで、あなたは無価値にアンラップしているわけではありません。あなたはjohn.residenceに対してアンラップを強制しており、価値があります。 – BangOperator

答えて

2

あなたがやっていることはオプションのチェーンと呼ばれています。オプションのチェーンと強制アンラッピング同じことを行うが、両方:それはのでnilとしてその.numberOfRoomsプロパティが設定されているResidenceインスタンスを、含まれていますnilない.residenceプロパティを、アンラップ

The main difference is that optional chaining fails gracefully when the optional is nil, whereas forced unwrapping triggers a runtime error when the optional is nil.

“The Swift Programming Language (Swift 2.2).” iBooks. https://itun.es/br/jEUH0.l

ますね力初期化されていません。あなたがアンラップしているわけではないので、オプションの連鎖のせいでエラーは出ません。

print(john.residence!.numberOfRooms!) 

それとも、あなたはnilとして.residenceを設定するために次の行を削除することができます:エラーを取得する代わりに.numberOfRoomsプロパティをアンラップ力を試してみてください

john.residence = Residence() 

この方法johnはそうしようと、何の.residenceを持っていません展開を強制すると、Swiftコンパイラは実行時エラーをスローします。

+0

わかりました。もう1つの質問ですが、どうして私はjohn.residence!室数!私はjohn.residence!.numberOfRoomsを使って自分の価値を得ることができます。 – Max

+0

'.numberOfRooms! 'を使うときは、このプロパティが' nil'を返さないことを完全に確信しています。これはデバッグの目的に役立ちます。値が 'nil'でなく、' nil'を返すと期待していた場合、プログラムは速やかに実行を停止するからです。これにより、値が 'nil'である間接的なエラーを避けることができます。 –

+0

@Maxオプションチェーンの詳細については、最新の回答を参照してください。 –

0

プロパティがnumberOfRoomsと定義されているため、あなたのアプリがクラッシュしませんか?。つまり、null値も許可されます。

の代わりに。この声明では間違いなくクラッシュするでしょう。

print(john.residence!.numberOfRooms) 

このリンクをクリックすると、その違いを理解するのに役立ちますか?そして!

Difference Between ? and ! in Swift Language?
+0

あなたが記述しているのは、_implicitly unwrapped optional_です。OPの問題は、_オプションチェーンを含むコードがランタイムエラーを返さない理由を示しています。 –

+0

@Bhumilka john.residence!.numberOfRoomsはクラッシュしないので、ご確認ください。それは無限の値 – Max

+0

@Maxを出力します。 'Residence'の初期化を' var numberOfRooms:Int! '(** ** ** ** ** **をここに置き換えて)と書くと' print'関数失敗する。ただし、これを使用しないでください。暗黙的にアンラップされたオプションの詳細はこちら:http://stackoverflow.com/questions/24006975/why-create-implicitly-unwrapped-optionals –

-1

I was expecting this line (print(john.residence!.numberOfRooms)) to crash as my numberOfRooms variable has nil value

print()アンラップを強制する必要なく、任意または「ゼロ」内部値を出力。 print()には、アンラップされた型を指定する必要はありません。たとえそうでも、オプションの中に価値があることを確認する必要があります。

UPDATE:

マックス。ちょうど物事をクリアするには、にはアンラップを強制していません。あなたはjohn.residenceに強制アンラッピングしており、値を持っています。あなたは実際にはオプションで印刷しています。それは 'オプションの値'または 'nil'を出力します。 そして、印刷中のオプションがエラーを出さない理由が分かっていれば、print()はオプションの値またはnilを出力するためです。 nil値ではクラッシュしません。

+0

False。 'print(john.residence!.NumberOfRooms!)'は実行時エラーをスローします。このエラーは、 'print()'がどのように動作するのかに起因するものではなく、オプションの連鎖が自動的に失敗するためにコードにスローされません。 –

+0

@TiagoMarinho質問が間違っているかもしれません。彼はnil値で 'numberOfRooms'がクラッシュしない理由を尋ねていました。以前は、nil値でオプションにアクセスするとエラーが発生するという前提がありました。エラーを出さずにオプションで印刷することもできます。その理由は、印刷が両方のケースを本当にうまく処理するからです。そして、私はこの質問に答えました。 "何も印刷していないので、何も印刷しても何のエラーも出ませんか?"この文脈では、私の記述は間違っていません。 – BangOperator

+0

それでは、「私は感嘆符で囲まれた強制アンラッピングを使用しています」という言葉に、私が質問を理解した文脈では無意味でした。 – BangOperator

関連する問題