In C# nehmen, dann ist es möglich, eine generische Methode aufzurufen durch Angabe des Typs:generische Funktion einen Typnamen in Swift
public T f<T>()
{
return something as T
}
var x = f<string>()
Swift erlaubt Ihnen nicht, eine generische Methode zu spezialisieren, wenn es aufgerufen wird. Der Compiler will auf Typinferenz verlassen, so 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, eine Art zu einer Funktion und diese Funktion zu übergeben ein Objekt dieser Art Rückkehr, unter Verwendung von Generika
Dies funktioniert, aber es ist nicht eine gute Passform für das, was ich tun möchte:
let x = f() as String?
EDIT (KLARSTELLUNG)
Ich war mir wahrscheinlich nicht ganz im Klaren darüber, was die Frage eigentlich ist, es geht um eine einfachere Syntax zum Aufruf einer Funktion, die einen gegebenen Typ (jeden Typ) zurückgibt.
Als einfaches Beispiel, sagen wir mal Sie eine Reihe von irgendwelchen haben und Sie 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 diese Funktion wie folgt aufrufen können:
let array = [something,something,something,...]
let x = findFirst(array) as String?
das ist ziemlich einfach ist, aber was ist, wenn der Typ einige Protokoll mit einer Methode zurückgegeben wird und Sie die Methode auf das zurückgegebene Objekt aufzurufen:
(findFirst(array) as MyProtocol?)?.SomeMethodInMyProtocol()
(findFirst(array) as OtherProtocol?)?.SomeMethodInOtherProtocol()
Diese Syntax ist nur peinlich. In C# (die als Swift ebenso stark typisiert ist), können Sie dies tun:
findFirst<MyProtocol>(array).SomeMethodInMyProtocol();
Leider, das ist nicht möglich, in Swift.
Die Frage ist also: gibt es eine Möglichkeit, dies mit einer saubereren (weniger umständlich) Syntax zu erreichen.
someFunc() geht für ein Objekt vom Typ der Suche zur Verfügung gestellt und gibt es zurück. So einfach ist das. Ich wollte die erforderliche Mindestanzahl an Informationen bereitstellen, da die Besonderheiten und das "Warum" irrelevant sind. –
@PhilippeLeybaert Bitte können Sie Ihre Frage klären. Sie sagen, dass 'T' ein beliebiges Protokoll sein kann, aber Sie können keine Instanz eines Protokolls erstellen. Protokolle sind abstrakt - Sie können immer nur eine Instanz eines konkreten Typs erstellen, der einem bestimmten Protokoll entspricht. Die "Besonderheiten" sind definitiv relevant für diese Frage. Ich bin mir nicht sicher, ob Sie eine Funktionsausgabe mit einem bestimmten Typ vergleichen und nur zurückgeben wollen, wenn sie diesem Typ entspricht - oder wenn Sie versuchen, eine neue Instanz eines bestimmten Typs zu erstellen, den Sie übergeben. – Hamish
Ich brauche keine Instanz zu erstellen. Die Funktion sucht nach Objekten, die diesem Protokoll entsprechen, und gibt sie dann zurück. Es müssen keine neuen Objekte erstellt werden. –