見出し画像

Swift 5.2の新しいとこ。 -Callable values(struct)

Callable values of user-defined nominal types

をみていきますが、要するに構造体を関数みたいに使うことができるようになったということです。サンプルコードです。

struct Dice {
   var lowerBound: Int
   var upperBound: Int
       
   func callAsFunction() -> Int {
       (lowerBound...upperBound).randomElement()!
   }
}

構造体の"Dice"があります。この中身はプロパティ2つとメッソド1つ。

メソッドには先に宣言されているプロパティ2つが使われている形です。

以前はメソッドを使う時には

let d12 = Dice(lowerBound: 1, upperBound: 12)
let roll2 = d12.callAsFunction()
print(roll2)

という感じで使っていましたが、Swift5.2からは

let d6 = Dice(lowerBound: 1, upperBound: 6)
let roll1 = d6()
print(roll1)

というふうにも書けるようになりました。簡素化できます。

引数について

struct StepCounter {
   var steps = 0
       
   mutating func callAsFunction(count: Int) -> Bool {
       steps += count
       print(steps)
       return steps > 10_000
   }
}

この構造体を使う時、

var steps = StepCounter()
let targetReached = steps(count: 10)

のように直接数字を引数にそのまま適応させることもできます。

注意点として、

callAsFunction を持つインスタンスを関数型に暗黙的変換することはできないので注意が必要です。
struct CallableStruct {
   var value: Int
   func callAsFunction(_ number: Int, scale: Int) {
       print(scale * (number + value))
   }
}

let callable = CallableStruct(value: 100)
let someFunction1: (Int, Int) -> Void = callable(_:scale:)  // Error

let someFunction2: (Int, Int) -> Void = callable.callAsFunction(_:scale:)


この記事が気に入ったらサポートをしてみませんか?