オプショナルってなんぞや
var msg:String = "ハロー"
msg = nil
↑ これめっちゃ怒られる。orz
オプショナルを使えば怒られないみたい
var msg:String? = "ハロー"
msg = nil
怒られないヤター
var msg:String? = "ハロー"
var newMsg = msg + "ワールド"
文字列連結させようとするとめっちゃ怒られる。。。orz
optional型だから怒ってるみたい
var msg:String? = "ハロー"
var newMsg = msg! + "ワールド"
怒られない
!
を使えばオプショナルバリューをアンラップしてStringに戻せるらしい
nil の時の初期値を設定する
nilの時に初期値を設定するには ??
を使う。
var count:Int? = 1
let value = 256 * (count ?? 2)
この場合 count
には 1 が設定されているので
出力される値は 256
var count:Int?
let value = 256 * (count ?? 2)
この場合は 512
が出力される。
オプショナルバインディング
中に入ってる値が nil
なら false
, nil
でないならアンラップするらしい。
if
と for
で使うらしい。
if文の時
var str:String?
str = "Hoge"
if let msg = str {
println(msg)
}
この場合 Hoge
が格納されているので、 "Hoge" が出力される。
var sum = 0
var dic:[String:Int?] = ["a":1, "b":2, "c":nil, "d":4]
for (_, value) in dic {
if let num = value {
sum += num
}
}
println(sum)
c
の value が nil
なので除外して合計された値 7 が出力される。
オプショナルチェインニング
メソッドチェインの最中に nil
があってもエラーにならずに nil
を返すらしい。便利
class Huga {
var hoge:Hoge?
}
class Hoge {
var sey:String = "hogehoge"
}
var user:Huga = Huga()
var sey = user.hoge?.sey
println(sey)
nil
が出力される。
Hoge にインスタンスを突っ込んで実行してみる
class Huga {
var hoge:Hoge? = Hoge()
}
class Hoge {
var sey:String = "hogehoge"
}
var user:Huga = Huga()
var sey = user.hoge?.sey
println(sey)
Optional("hogehoge")
が出力される。
class Huga {
var hoge:Hoge? = Hoge()
}
class Hoge {
var sey:String = "hogehoge"
}
var user:Huga = Huga()
var sey = user.hoge?.sey as String!
println(sey)
hogehoge
出力された
Stringでアンラップすれば行けるぽ
オプショナル便利!