Ich habe versucht, meine Frage sehr einfach zu halten. Ich habe den ganzen Tag gekämpft, um es zum Laufen zu bringen, aber kein Glück. Ich habe zwei Protokolle. Decodierbar und anforderbar.Swift-Protokolle mit zugeordnetem Typ und Generics, die falsche Funktion aufrufen
protocol Decodable { }
struct D: Decodable { }
protocol Requestable {
associatedtype Model
}
extension Requestable {
func returnValue() {
Utils.doSomething(Model)
}
}
Und eine Klasse Utils
class Utils {
static func doSomething<T>(param: T) {
print("Default")
}
static func doSomething<T: Decodable>(param: T) {
print("Decodable")
}
static func doSomething<T: Decodable>(param: [T]) {
print("Decodable Array")
}
}
ich eine Struktur R Implementierung Auf Anfrage erhältlich erstellen und den Typ alias Modell zu String geben
struct R: Requestable {
typealias Model = String
}
Wenn ich die R run(). Return () Funktion, druckt Default
. Wie erwartet.
ich eine Struktur R2 Implementierung Auf Anfrage erhältlich erstellen und den Typ alias Modell zu D geben die
struct R2: Requestable {
typealias Model = D
}
Wenn ich laufen die R2(). Return() Funktion Dekodierbare implementiert, Er druckt Default
. aber ich habe erwartet, dass es Decodable
drucken würde, weil das Modell Decodable
entspricht.
ich eine struct R3 Auf Anfrage erhältlich Implementierung und den Typ alias Modell zu [D] geben, wo das Element des Arrays decodierbar
struct R3: Requestable {
typealias Model = [D]
}
Umsetzung Wenn i R3(). Return() Funktion ausführen, It druckt Default
. aber ich erwartete, dass es drucken würde, weil das Modell Decodable
entspricht.
Jede Art von Hilfe geschätzt.
UPDATE
Mit AnyRequestable und im laufenden Betrieb überprüft wird in diesem Fall nicht funktionieren, weil in echtem Code die Generika ist der Rückgabewert und nicht dynamisch überprüft werden kann.
Im wirklichen Codefunktionen Signaturen sind wie
public static func ResponseSerializer<M>() -> ResponseSerializer<M, NSError> {}
public static func ResponseSerializer<M: Decodable>() -> ResponseSerializer<M, NSError> {}
public static func ResponseSerializer<M: Decodable>() -> ResponseSerializer<[M], NSError> {}
Mein Bad. Ich habe auch einen normalen Fall hinzugefügt. Und das Modell könnte auch [decodierbar] sein. –
Schätzen Sie Ihre Hilfe. Ich habe die gleiche Antwort hier. http://stackoverflow.com/questions/35431712/generic-method-override-not-working-in-swift. Aber es gibt keine Möglichkeit, die Laufzeit zu überprüfen. Ich kämpfe seit so vielen Tagen darin. –
@RahulKatariya: Sie, mein Freund, haben Glück. Weil ich nur die Technik erfunden habe, die du brauchst, um dein Problem zu lösen. Treffen Sie [OpaqueSwift] (https://github.com/vmanot/OpaqueSwift). –