Generische Funktion, die in Swift @ einen Typnamen annim

In C # kann eine generische Methode durch Angabe des Typs aufgerufen werden:

public T f<T>()
{
   return something as T
}

var x = f<string>()

it @Swift können Sie eine generische Methode beim Aufrufen nicht spezialisieren. Der Compiler möchte sich auf Typinferenz verlassen, daher ist dies nicht möglich:

func f<T>() -> T? {
    return something as T?
}

let x = f<String>() // not allowed in Swift

Was ich brauche, ist eine Möglichkeit, einen Typ an eine Funktion zu übergeben, und diese Funktion gibt ein Objekt dieses Typs unter Verwendung von generics @ zurüc

Das funktioniert, passt aber nicht zu dem, was ich machen möchte:

let x = f() as String?

EDIT (ERKLÄRUNG)

Ich war mir wahrscheinlich nicht ganz sicher, was die eigentliche Frage ist. Es geht um eine einfachere Syntax zum Aufrufen einer Funktion, die einen bestimmten Typ (einen beliebigen Typ) zurückgibt.

Als einfaches Beispiel nehmen wir an, Sie haben ein Array von Any und erstellen eine Funktion, die das erste Element eines bestimmten Typs zurückgibt:

// 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
}

Sie können diese Funktion folgendermaßen aufrufen:

let array = [something,something,something,...]

let x = findFirst(array) as String?

Das ist ziemlich einfach, aber was ist, wenn der zurückgegebene Typ ein Protokoll mit einer Methode ist und Sie die Methode für das zurückgegebene Objekt aufrufen möchten:

(findFirst(array) as MyProtocol?)?.SomeMethodInMyProtocol()
(findFirst(array) as OtherProtocol?)?.SomeMethodInOtherProtocol()

Diese Syntax ist nur umständlich. In C # (das genauso stark wie Swift geschrieben ist) können Sie dies tun:

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

Leider ist das in Swift nicht möglich.

So ist die Frage: gibt es eine Möglichkeit, dies mit einer saubereren (weniger umständlichen) Syntax zu erreichen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage