160

このチュートリアルに従って、iOS 8 / OSX 10.10 の Swift を学習しています。この段落 (オブジェクトとクラスの下)のように、「ラップされていない値」という用語が何度か使用されています。

オプションの値を扱うときは、? と書くことができます。メソッド、プロパティ、添字などの操作の前。? の前の値の場合 nil、? の後のすべて は無視され、式全体の値は nil です。それ以外の場合、オプションの値は unwrappedであり、? の後のすべてです。アンラップされた値に作用します。どちらの場合も、式全体の値はオプションの値です。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare?.sideLength

私はそれを取得し、運が悪いとウェブ上で検索しました。

これはどういう意味ですか?


編集

Cezary の回答から、元のコードの出力と最終的なソリューション (プレイグラウンドでテスト) にはわずかな違いがあります。

元のコード

元のコード

セザリーのソリューション

セザリーのソリューション

2 番目のケースではスーパークラスのプロパティが出力に表示されますが、最初のケースでは空のオブジェクトが表示されます。

結果はどちらの場合も同じではないでしょうか?

関連 Q&A : Swift のオプション値とは何ですか?

4

5 に答える 5

296

まず、Optional 型とは何かを理解する必要があります。オプションの型は、基本的に、変数が になる可能性があることを意味します nil

例:

var canBeNil : Int? = 4
canBeNil = nil

疑問符は、 がcanBeNil可能であることを示しますnil

これはうまくいきません:

var cantBeNil : Int = 4
cantBeNil = nil // can't do this

オプションの変数から値を取得するには、unwrap する必要があります。これは、末尾に感嘆符を付けることを意味します。

var canBeNil : Int? = 4
println(canBeNil!)

コードは次のようになります。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare!.sideLength

補足:

疑問符の代わりに感嘆符を使用して、自動的にアンラップするオプションを宣言することもできます。

例:

var canBeNil : Int! = 4
print(canBeNil) // no unwrapping needed

したがって、コードを修正する別の方法は次のとおりです。

let optionalSquare: Square! = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare.sideLength

編集:

あなたが見ている違いは、オプションの値がラップされているという事実の症状です。その上に別のレイヤーがあります。ラップされていないバージョンは、ラップされていないため、まっすぐなオブジェクトを示しているだけです。

簡単な遊び場の比較:

遊び場

最初と 2 番目のケースでは、オブジェクトは自動的にラップ解除されていないため、2 つの「レイヤー」が表示されます ( {{...}})。3 番目のケースでは{...}、オブジェクトが自動的にラップ解除されているため、1 つのレイヤーのみが表示されます ( )。

最初のケースと 2 番目の 2 つのケースの違いは、optionalSquareが に設定されている場合、2 番目の 2 つのケースでは実行時エラーが発生することですnil。最初のケースの構文を使用すると、次のようなことができます。

if let sideLength = optionalSquare?.sideLength {
    println("sideLength is not nil")
} else {
    println("sidelength is nil")
}
于 2014-06-04T10:05:41.167 に答える