В С# можно вызвать общий метод, указав тип:
public T f<T>()
{
return something as T
}
var x = f<string>()
Swift не позволяет вам специализировать общий метод при его вызове. Компилятор хочет полагаться на вывод типа, поэтому это невозможно:
func f<T>() -> T? {
return something as T?
}
let x = f<String>() // not allowed in Swift
Мне нужен способ передать тип функции, и эта функция возвращает объект этого типа, используя generics
Это работает, но это не очень подходит для того, что я хочу сделать:
let x = f() as String?
РЕДАКТИРОВАТЬ (ПОДТВЕРЖДЕНИЕ)
Я, вероятно, не совсем понял, что вопрос на самом деле, все о более простом синтаксисе для вызова функции, которая возвращает данный тип (любой тип).
В качестве простого примера предположим, что у вас есть массив Any, и вы создаете функцию, которая возвращает первый элемент данного типа:
// returns the first element in the array of that type
func findFirst<T>(array: [Any]) -> T? {
return array.filter() { $0 is T }.first as? T
}
Вы можете вызвать эту функцию следующим образом:
let array = [something,something,something,...]
let x = findFirst(array) as String?
Это довольно просто, но что, если возвращаемый тип - это какой-то протокол с методом и вы хотите вызвать метод на возвращаемом объекте:
(findFirst(array) as MyProtocol?)?.SomeMethodInMyProtocol()
(findFirst(array) as OtherProtocol?)?.SomeMethodInOtherProtocol()
Этот синтаксис просто неудобен. В С# (который так же сильно напечатан как Swift) вы можете сделать это:
findFirst<MyProtocol>(array).SomeMethodInMyProtocol();
К сожалению, это невозможно в Swift.
Итак, вопрос: есть способ сделать это с помощью более чистого (менее неудобного) синтаксиса.