LoginSignup
18
14

More than 5 years have passed since last update.

SwiftでもKotlinのif式を使いたい

Last updated at Posted at 2017-06-30

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も使っていて実用性がありません。。。
コメントでご指摘いただき修正しました!実用できそうです :bulb:

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で書いてみました。
クロージャを使うので少しだけネストが増えますが、便利に使えそうです。

参考

18
14
2

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
18
14