#swift #swift3
#swift #swift3
Вопрос:
Для данной универсальной функции
func myGenericFunction<T>() -> T { }
Я могу установить, с каким классом будет этот общий
let _:Bool = myGenericFunction()
есть ли способ сделать это, чтобы мне не нужно было определять переменную отдельно в другой строке?
пример: anotherFunction(myGenericFunction():Bool)
Комментарии:
1. Вы не можете «явно специализировать универсальную функцию». Я просто проводил кое-какие исследования по этому поводу. Это было предложено в списке рассылки, но, похоже, никуда не делось: lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160523 /…
Ответ №1:
Компилятору нужен некоторый контекст для определения типа T
. При назначении переменной это можно сделать с помощью аннотации типа или приведения:
let foo: Bool = myGenericFunction()
let bar = myGenericFunction() as Bool
Если anotherFunction
принимает Bool
параметр, то
anotherFunction(myGenericFunction())
просто работает, T
затем выводится из типа параметра.
Если anotherFunction
принимает общий параметр, то приведение выполняется снова:
anotherFunction(myGenericFunction() as Bool)
Другой подход заключался бы в передаче типа в качестве аргумента
вместо этого:
func myGenericFunction<T>(_ type: T.Type) -> T { ... }
let foo = myGenericFunction(Bool.self)
anotherFunction(myGenericFunction(Bool.self))