Общая функция, принимающая имя типа в Swift

В C # можно вызвать универсальный метод, указав тип:

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

Что мне нужно, это способ передачи типа в функцию, и эта функция возвращает объект этого типа, используя обобщенные

Это работает, но не подходит для того, что я хочу сделать:

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

Этот синтаксис просто неловко. В C # (который так же строго типизирован, как Swift), вы можете сделать это:

findFirst<MyProtocol>(array).SomeMethodInMyProtocol();

К сожалению, это не возможно в Swift.

Итак, вопрос в следующем:Есть ли способ сделать это с помощью более чистого (менее неудобного) синтаксиса.

Ответы на вопрос(2)

Ваш ответ на вопрос