4. var a : Int = 1
var b : Int? = 2
a = nil // エラー
b = nil // OK
b = Int(“abcd”) // nil
var c : Optional<Int> = 3 // パラメータ付き型指定
5. 開示(unwrap)
var a : Int? = 1234
var b : Int = a - 2 // 型が異なるのでコンパイル・エラー
var b : Int = a! - 2 // 開示指定する
a = nil
b = a! - 2 // 実行時エラー
a = 5678
if a != nil {
print(“(a!)”) // 開示指定が必要
}
print(String(describing: a)) // Debug目的で
6. オプショナル束縛構文
optional binding
var num : Int? = 1234
if let n = num {
print(“(n)”)
}
if var n = Int(“1234”) {
n += 5678
print(“(n)”)
}
if let n = Int(“1234”), let m = Int(“5678”) {
print(“(n + m)”)
}
var a : Int? = 1
while let n = a {
a = nil
}
7. guard文
guard 条件 else { /* breakやreturn */ }
func demo(_ num:Int?) {
guard let n = num else { return }
print(“(n)”) // 変数nが使える
}
8. nil合体演算子
let n : Int? = 1234
let m = (n != nil) ? n! : 0
let m = n ?? 0
let a : Int? = nil
let b : Int? = nil
let c : Int? = 3
let = a ?? b ?? c ?? 0 // cの値
9. func demo(_ p: inout Int?) {
p = nil
}
var n: Int? = 1234
demo(&n)
print(n ?? “nil”)
func test(_ num: inout Int) {
num = 0
}
n = 5678
test(&n!) // nがnilだと実行時エラー
print(n ?? “nil”)
10. 有値オプショナル型
(IUO)
let n : Int! = 1234
print(“(n)”) // 開示指定は不要
var m : Int! = nil
m += 5678 // 実行時エラー
print(“(m)”)
11. 失敗のあるイニシャライザ
struct Demo {
var a = 0
init?(_ n:Int) {
if n < 0 {
return nil
}
a = n
}
init() {
a = 1234
}
}
var p: Demo = Demo()
var q: Demo? = Demo(5678)
12. キャスト演算子
• 式 is T
型/プロトコルTなら真
• 式 as T
型/プロトコルTにキャスト
• 式 as? T
型/プロトコルTのオプショナルにキャスト
失敗した場合はnil
• 式 as! T
型/プロトコルTにキャスト
失敗した場合は実行時エラー