Ответ 1
Вы должны использовать общую функцию, в которой параметр используется только для информации о типе, поэтому вы передаете ее в T
:
func doSomething<T>(_ a: Any, myType: T.Type) {
if let a = a as? T {
//…
}
}
// usage
doSomething("Hello World", myType: String.self)
Используя инициализатор типа T
Вы не знаете подпись T
вообще, потому что T
может быть любым типом. Таким образом, вы должны указать подпись в протоколе.
Например:
protocol IntInitializable {
init(value: Int)
}
С помощью этого протокола вы могли бы написать
func numberFactory<T: IntInitializable>(value: Int, numberType: T.Type) -> T {
return T.init(value: value)
}
// usage
numberFactory(value: 4, numberType: MyNumber.self)