LoginSignup
3
4

More than 5 years have passed since last update.

SwiftでOptionalをためす

Posted at

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

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

オプショナル便利!

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4