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 を繋げて呼び出すことも可能。

参考