0

以下のコードがあり、正常に動作しますが、変数に値があり、その値を に引数として渡すときに強制ラッピングを使用していないため、行print(john.residence!.numberOfRooms)がクラッシュすることを期待していました。これが実行時エラーをトリガーせず、代わりに安全に印刷されない理由を誰でも説明できますか?numberOfRoomsnilprint()nil

class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms: Int?
}

let john = Person()

john.residence = Residence()

print(john.residence!.numberOfRooms)
4

2 に答える 2

2

あなたがしていることはOptional Chainingと呼ばれます。Optional Chaining と Forced Unwrapping はどちらも同じことを行いますが、次の点が異なります。

主な違いは、オプションが nil の場合、オプションの連鎖は正常に失敗するのに対し、オプションが nil の場合、強制アンラップは実行時エラーをトリガーすることです。

「Swift プログラミング言語 (Swift 2.2)」。アイブック。https://itun.es/br/jEUH0.l

.residenceではないプロパティを強制的にアンラップしています。初期化されていないため、プロパティが設定されているインスタンスnilが含まれています。ラップを強制的に解除しないため、オプションのチェーンによりエラーは発生しません。エラーが発生する代わりに、プロパティのラップを強制的に解除してみてください。Residence.numberOfRoomsnil.numberOfRooms

print(john.residence!.numberOfRooms!)

または、次の行を削除して次のように設定でき.residenceますnil

john.residence = Residence()

この方法johnには がない.residenceため、強制的にアンラップしようとすると、Swift コンパイラが実行時エラーをスローします。

于 2016-05-24T07:03:03.300 に答える
0

プロパティnumberOfRooms?で定義しているため、アプリはクラッシュしません。. これは、null 値も許可することを意味します。

使用してください代わりに. このステートメントで間違いなくクラッシュします。

 print(john.residence!.numberOfRooms)

このリンクにアクセスすると、? の違いを理解するのに役立ちます。と !。
との差 ?と !スウィフト言語で?

于 2016-05-24T07:20:08.397 に答える