swift-evolution 読んでいくぞ
開発環境
> xcodebuild -version
Xcode 13.0
Build version 13A233
# Swift 5.5
callAsFunction とは
struct Subtracter {
var base: Int
func callAsFunction(_ x: Int) -> Int {
return base - x
}
}
let subtracter = Subtracter(base: 11)
subtracter(1) // 10 (= 11 - 10)
subtracter(10) // 1 (= 11 - 1)
構造体で callAsFunction という命名でメソッドを書けば、関数のように呼び出すことが可能。
プロポーザル はSE-0253。 既に採択されて実装済み。Swift 5.2から利用可能。
何が嬉しい?
構造体の実体のメソッド呼び出しの記述量が少なくなる。
// Before
struct Subtracter {
var base: Int
func subtract(_ x: Int) -> Int {
return base - x
}
}
let subtracter = Subtracter(base: 11)
subtracter.subtract(1) // 10 (subtracter.subtractでくどい)
導入前は上記のように書く必要があった。
// After
struct Subtracter {
var base: Int
func callAsFunction(_ x: Int) -> Int {
return base - x
}
}
let subtracter = Subtracter(base: 11)
subtracter(1) // 10 (スッキリ!)
callAsFunctionの導入後は、構造体の実体からのメソッド呼び出しが、関数呼び出しだけで済むようになった。
おまけ
Subtracter(base: 11)(2) // 9
構造体の実体化と callAsFunction を繋げて呼び出すことも可能。