Posted at

SwiftでOptionalをためす

More than 3 years have passed since last update.

オプショナルってなんぞや

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 でないならアンラップするらしい。

iffor で使うらしい。


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でアンラップすれば行けるぽ

オプショナル便利!