December 14,2015
swift2からguard
が使えるようになった。
A guard statement is used to transfer program control out of a scope if one or more conditions aren’t met.
Appleの公式レファレンスには上記のように書かれていた。
OptionalなInt値で、numを受け取る関数はちょっと書くのが面倒だった
func sample(num: Int?) {
if num == nil {
return
}
// numがnilでなかったら
// numをInt値をして以下を実行
let n = num!
print(n)
}
こういうのよくありますよね…
guardを使えば、わかりやすく綺麗に書くことができる
func sample(num: Int?) {
guard let n = num else {
return
}
print(n)
}
func fetchListOfCustomers(customers: [Customer]?) {
if !reachable {
return
}
if !connected {
return
}
if let customers = customers where customers.count > 0 {
// Do it!
print(customers)
}
}
func fetchListOfCustomers(customers: [Customer]?) {
guard reachable else {
return
}
guard connected else {
return
}
guard let customers = customers where customers.count > 0 else {
return
}
// Do it!
print(customers)
}
もう少し簡潔に書くと
func fetchListOfCustomers(customers: [Customer]?) {
guard reachable && connected,
let customers = customers where customers.count > 0 else {
return
}
// Do it!
print(customers)
}
let maybeNumbers: [Int?] = [3, 7, nil, 12, 40]
for maybeValue in maybeNumbers {
if let value = maybeValue {
print(value)
} else {
print("No Value")
}
}
// 出力結果
// 3
// 7
// No Value
// 12
// 40
let maybeNumbers: [Int?] = [3, 7, nil, 12, 40]
for maybeValue in maybeNumbers {
guard let value = maybeValue else {
print("No Value")
continue
}
print(value)
}
// 出力結果
// 3
// 7
// No Value
// 12
// 40
もしnilが出た時点で、for文のループ止めたいなら
let maybeNumbers: [Int?] = [3, 7, nil, 12, 40]
for maybeValue in maybeNumbers {
guard let value = maybeValue else {
print("No Value")
break
}
print(value)
}
// 出力結果
// 3
// 7
// No Value
guardをきちんと使えば、コードの可視性があがりそうですね^^