2017-07-21 2 views
3

Ich würde jede Einsicht in dieses Problem, das ich habe, schätzen. Ich versuche, in Swift eine generische Funktion zu erstellen, die jeden Typ akzeptiert, der einem bestimmten Protokoll entspricht. Wenn ich jedoch einen übereinstimmenden Typ in diese Methode übergebe, erhalte ich einen Compilerfehler, der besagt, dass die Klasse nicht konform ist.Protokollkonformität, die in generischer Funktion nicht erkannt wird

Hier ist mein Protokoll:

protocol SettableTitle { 
    static func objectWithTitle(title: String) 
} 

Und hier ist eine Klasse die ich gemacht habe, die zu diesem Protokoll entspricht:

class Foo: SettableTitle { 
    static func objectWithTitle(title: String) { 
     // Implementation 
    } 
} 

Schließlich ist hier meine generische Funktion, die in einer anderen Klasse lebt:

Jetzt, wenn ich die Methode wie folgt aufrufen:

SomeClass.dynamicMethod(type: Foo.self, title: "Title string!") 

erhalte ich den folgenden Compiler-Fehler: error: argument type 'Foo.Type' does not conform to expected type 'SettableTitle' SomeClass.dynamicMethod(type: Foo.self, title: "Title string!")

Ich kann nicht verstehen, warum dies geschehen würde, wenn die Klasse Foo deklariert und implementiert SettableTitle Konformität.

All dies ist in einem einfachen Spielplatz in Xcode 8.3 (neueste Nicht-Beta). Kann irgendjemand etwas sehen, was ich hier falsch mache?

Antwort

0

Ihre Funktion erwartet ein Objekt, das SettableTitle implementiert, kein Typ.

Stattdessen müssen Sie T.Type tun, und es wird funktionieren:

class SomeClass { 
    static func dynamicMethod<T: SettableTitle>(type: T.Type, title: String) { 
    T.objectWithTitle(title: title) 
    } 
} 

Quelle: Using a Type Variable in a Generic

+0

Dies hat den Trick! Ich denke, ich sollte das Generika-Kapitel noch einmal durchlesen. Vielen Dank! – Drew