Swiftの!と?の違いと使い方
初めまして! かずきです。
この頃Unityばかり触っているので、Swiftを忘れかけている。。。 という事でSwift入門者向けの記事を何回に分けて書いていこうと思います!
オプショナル型とは
オプショナル型は変数宣言時にデータ型名の後ろに?
をつけることで利用出来るnil許容型
です。
var hoge : Int? var hogehoge : int!
!
については後ほど説明致します。
オプショナル型のアンラップ
そのままオプショナル型の変数を利用しようとするとOptional()
に囲まれた状態で中に入った値を利用できません。
var hoge : Int? = 114514 print(hoge) // => Optional(114514)
強制アンラップ
名前の通り強制的にオプショナル型をアンラップする方法です。
オプショナル型変数の値がnil
の場合エラー
が発生します。
var hogehoge : String? = nil print(hogehoge!) // エラー hogehoge = "屋上あんだけど焼いてかない?" print(hogehoge!) // => 屋上あんだけど焼いてかない?
nilを許容しない
場面でアンラップする際に使用します。
オプショナルバインディング
オプショナルバインディングは、if文などの条件式として利用します。
オプショナル型変数の値がnil以外
場合、条件式左辺で宣言した変数にアンラップされた値が代入されます。
if let unwrapfuga = fuga { // fugaが`nil以外`の場合(アンラップされた値がunwrapfugaに代入されている) } else { // fugaがnilの場合(unwrapfugaは利用不可) }
nilを許容する
場面で、変数の値がnilでない
場合のみ処理を行いたい場合などに使用します。
オプショナルチェイニング
オプショナル型変数に含まれるメソッドやプロパティを利用する際に使用します。
オプショナルチェイニングを使用してメソッドやプロパティにアクセスした場合、戻り値は全てオプショナル型
となります。
※例えばこのようなクラスがあったとします。
class HogeHoge{ private var name : String = "yajuu" public var Name : String { get { return self.name } } public func IceTea() -> String { return "おまたせ!アイスティーしかなかったけどいいかな?" } }
変数hogehgeに値が入っている場合はオプショナル型の戻り値が帰ってきます。
var hogehoge : HogeHoge? = HogeHoge() print(hogehoge?.Name) // => Optional("yajuu") print(hogehoge?.IceTea()) // => Optional("おまたせ!アイスティーしかなかったけどいいかな?")
変数hogehogeがnil
の場合は戻り値もnil
になります。
var hogehoge : HogeHoge? = nil print(hogehoge?.Name) // => nil print(hogehoge?.IceTea()) // => nil
戻り値を強制アンラップ
かオプショナルバインディング
して使用します。
暗黙的アンラップ型
暗黙的アンラップ型はオプショナル型の一種で、使用時に自動で強制アンラップを行います。
// オプショナル型 var a : Int? = 10 var b : Int = 20 var c = a! + b // cc = 30 var a : Int? = 10 var b : Int = 20 var c = a + b // エラー // 暗黙的アンラップ型 var aa : Int! = 10 var bb : Int = 20 var cc = aa + bb // 自動的に強制アンラップされるので、ccは30になる
主に初期化時以外でのnilが許容されない場面で使用します。