1. ホーム
  2. ios

[解決済み] Swiftの「unwrapped value」って何?

2022-04-26 03:55:26

質問

iOS 8 / OSX 10.10用のSwiftを以下の方法で学習中です。 このチュートリアル という用語と、" アンラップドバリュー は、この段落のように何度も使用されています。 オブジェクトとクラス ):

オプショナルな値を扱う場合、操作の前に ? メソッド、プロパティ、添え字のようなものです。の前に値がある場合、? の前の値がnilの場合、?の後の値はすべて無視され、全体の値として扱われます。 式はnilになります。それ以外の場合は オプションの値がアンラップされる そして の後にあるものはすべて ラップされていない値 . どちらの場合も の値は、式全体がオプションの値である。

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

このような場合、どのようにすればよいのでしょうか?

これはどういうことなのでしょうか?


編集

Cezaryの回答から、元のコードの出力と最終的な解決策(プレイグラウンドでテスト)の間にわずかな違いがあります:

オリジナルコード

Cezaryのソリューション

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

どちらの場合も同じ結果になるはずでは?

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

どのように解決するのですか?

まず、Optional型とは何かを理解する必要があります。オプショナル型とは、基本的に、変数 とすることができます。 nil .

var canBeNil : Int? = 4
canBeNil = nil

クエスチョンマークは、以下の事実を示しています。 canBeNil とすることができます。 nil .

これではうまくいかない。

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

変数がオプションの場合、その値を取得するためには アンラップする . これは、最後に感嘆符を付けるだけです。

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

EDIT

あなたが見ている違いは、まさにその症状で、オプションの値が ラップ . その上にもう一つの層があります。その アンラップド のバージョンでは、ラップされていないため、まっすぐなオブジェクトが表示されるだけです。

簡単な遊び方の比較です。

1つ目と2つ目のケースでは、オブジェクトは自動的にアンラップされないので、2つのレイヤー("layer")が表示されます。 {{...}} ) が、3番目のケースでは、1つのレイヤーだけが表示されます ( {...} というのは、オブジェクトは自動的にアンラップされるからです。

最初のケースと2つ目のケースの違いは、2つ目のケースは、もし optionalSquare が設定されている場合 nil . の構文を使うと、次のようなことができます。

if let sideLength = optionalSquare?.sideLength {
    println("sideLength is not nil")
} else {
    println("sidelength is nil")
}