Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

参考

jnikd
Androidアプリを作ってます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした