Предположим, у нас есть протокол с typealias
как:
// common closure types
typealias Action = () -> Void
typealias Consumer<T> = (T) -> Void
// here starts the fun
typealias AsyncAction = (Action?) -> Void
typealias AsyncGetter<T> = (Consumer<T>?) -> Void
typealias AsyncSetter<T> = (T, Action?) -> Void
// make compiler and you happy
typealias Foo = Void
typealias Bar = Void
protocol FooBarDatabaseAccess {
func doSomething()
func doSomethingAsync(completion: Action?)//: AsyncAction
func getFooAsync(completion: Consumer<Foo>?)//: AsyncGetter<Foo>
func getBarAsync(completion: Consumer<Bar>?)//: AsyncGetter<Bar>
func setBarAsync(value: Bar, completion: Action?)//: AsyncSetter<Bar>
}
Я хотел бы указать тип функции, подобный let
/ var
объявлений с двоеточием, за которым следует присваиваемый тип:
/* -- let/var -- */
// implicitly typed as String, determined from initial assignment
let implicitString = ""
// explicitly typed as String, though initialisation is omitted here
let explicitString: String
/* -- func -- */
// implicitly typed as () -> Void, determined from argument/return type(s)
func implicitAction()
// explicitly typed as Action, compiler should complain if it does not conform to the type (alias)
???
Как этого добиться?
Возможный обходной путь - преобразовать его в объявление свойства, но это сбивает с толку:
var explicitAction: Action = { get }