Kotlinのif式が便利なので、Swiftでも使いたいなーと思って試してみました。
Kotlinのif式
- if式が値を返すので、そのまま変数に代入できて便利です。
val boolean = true
val string: String = if (boolean) {
val str1 = "Hello"
val str2 = "World"
str1 + " " + str2
} else {
"NO"
}
print(string) // Hello World
Swiftで困ったこと
単純に値を代入するだけであれば、三項演算子を使えばOKです。
let string: String = boolean ? "YES" : "NO"
しかし、分岐した後に複数行の処理を入れられません。
// こんな記述はできない
let string: String = boolean ? {
let str1 = "Hello"
let str2 = "World"
return str1 + " " + str2
} : "NO"
クロージャが使えそう
Swiftのリファレンスをみてみると、Setting a Default Property Value with a Closure or Functionの項にクロージャを使ってプロパティに初期値をセットする方法が書かれています。クロージャは値を返せるので利用できそうです。
// Setting a Default Property Value with a Closure or Functionの項より引用
let someProperty: SomeType = {
return someValue
}()
クロージャ + 三項演算子で実装
クロージャを返すようにするだけで簡単に実装できました。
let string: String = boolean ? {
let str1 = "Hello"
let str2 = "World"
return str1 + "" + str2
}() : "NO"
初期値を与えて$0
で使うこともできます。
let string: String = boolean ? {
let str2 = "World"
return $0 + "" + str2
}("Hello") : "NO"
クロージャ + switch文で実装
三項演算子では2つの分岐しか作れないので、3つ以上に分岐するためswitch文を使ってみます。
2重のクロージャになってしまうし、内部で値を保持するためにvar
も使っていて実用性がありません。。。
コメントでご指摘いただき修正しました!実用できそうです
let num = 0
let string: String = {
switch num {
case 0:
let str1 = "Hello"
let str2 = "World"
return str1 + "" + str2
case 1:
return ""
default:
return ""
}
}()
まとめ
Kotlinのif式っぽいものをSwiftで書いてみました。
クロージャを使うので少しだけネストが増えますが、便利に使えそうです。