2017-05-18 21 views
1

Ich versuche, eine Klassenmethode auf einem generischen T: BaseModel aufzurufen, wobei T eine Unterklasse von BaseModel sein kann. Zum Beispiel Car. Wenn T Car sein soll, möchte ich, dass meine Klassenmethode in der Klasse Car aufgerufen wird.So rufen Sie eine statische Methode für eine Klassenvorlagenmethode auf?

Es ruft jedoch immer die BaseModel-Klassenmethode auf.

class func parse<T: BaseModel>(json: JSON, context: NSManagedObjectContext) throws -> T? { 
    return T.classParseMethod(json: json) //This never calls the Car.classParseMethod() 
} 

wo

let carObject = parse(json:json, context:context) as? Car 

Jede Hilfe?

Antwort

0

Die Umwandlung erfolgt nach dem Funktionsaufruf, sodass die generische Abhängigkeit in T = BaseModel aufgelöst wird. Sie wollen, dass die Funktion der Art zu wissen, so ist es richtig, die generische Einschränkung lösen können:

func parse<T: BaseModel>(_ str: String) -> T? { 
    print(T.Type.self) // should print like: Car.Type 
    return T.parse(str) as? T 
} 

// Make the desired type known to swift 
let car: Car? = parse("My Car Format String") 
+0

Wer weiß, warum Sie noch in der generischen Parse-Methode nach T ('T.parse (str) als? T') werfen müssen? – hola

+0

Funktioniert nicht in meinem Code. Vielleicht, weil ich arbeite, sind Klassenfunktionen. – Mikael

0

Eine Lösung, die zu funktionieren scheint:

func myFunc<T: BaseModel>(_ type: T.Type,..) -> T? { 
    type.aClassFunc() 
{ 

hinzufügen Wenn ich den Anruf Folgendes funktioniert.

Es scheint wirklich zu viel, nur um dies zu erreichen, aber es könnte einen Grund dafür geben.

Verwandte Themen