Задает тип общего возврата T в swift

#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))