Wraz opublikowaniem wersji Swift 5.2 pojawiła się kolejna nowość – to „Callable values of user-defined nominal types”, czyli wywoływanie własnego typu z przekazaniem wartości w taki sam sposób, jak składnia funkcji.

SE-0253

Brzmi to bardzo groźnie, ale najlepiej to widać na przykładzie:

struct CallableStruct {
    var value: Int
    func callAsFunction(_ number: Int, scale: Int) {
        print(scale * (number + value))
    }
}
let callable = CallableStruct(value: 100)
callable(4, scale: 2)
callable.callAsFunction(4, scale: 2)
// oba wywołania wypiszą liczbę 208. 

Jak widać w przykładzie, wywołujemy bezpośrednio przekazując wartość, jeśli jej typ implementuje metodę o nazwie callAsFunction ().

Możemy dodać tyle parametrów, ile chcemy. Możemy kontrolować wartość zwracaną, a nawet oznaczyć metody jako mutujące w razie potrzeby. Możemy nawet zdefiniować wiele metod callAsFunction w jednym typie.

UWAGA: callAsFunction różni się od @dynamicCallable w następujący sposób: kiedy deklarujemy metodę call-as-function, określamy liczbę argumentów oraz typ i etykietę każdego argumentu. Jednak deklarując metodę atrybutu dynamicCallable określamy tylko typ używanych do przechowywania tablicy argumentów.

Więcej informacji możecie znaleźć tutaj SE-0253 Callable values of user-defined nominal types