[解決済み] Swiftの「unwrapped value」って何?
質問
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")
}
関連
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] なぜ「Implicitly Unwrapped Optionals」を作るのか、それは値があることを知っていることを意味しているからです。
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] Swift: ガードレット vs if let
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IOS8 Development Guide Error Thread 1: signal SIGABRT
-
JenkinsがIOSを自動パッケージングしてモミを配布
-
[解決済み] 文字列の長さを取得する
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] UIViewの左上と右上だけにcornerRadiusを設定する方法は?
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
-
[解決済み】Swiftのオプション値とは何ですか?