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:)
この記事が気に入ったらサポートをしてみませんか?