2017-05-18 19 views
1

私はgenericメソッドT: BaseModelでクラスメソッドを呼び出そうとします。ここで、TはBaseModelのサブクラスになります。 たとえば、Carです。 TがCarである必要がある場合、クラスメソッドがCarクラスで呼び出されるようにします。クラステンプレートメソッドで静的メソッドを呼び出す方法は?

ただし、常にBaseModelクラスメソッドを呼び出すことになります。

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

どこ

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

任意のヘルプ?

答えて

0

汎用呼び出しがT = BaseModelに解決されるように、関数呼び出しの後にキャストが実行されます。あなたはそれが適切に汎用的な制約を解決することができるように機能のタイプが知りたい:

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

一般的な解析メソッドでT( 'T.parse(str)as?T')にキャストする必要がある理由は誰でも知っていますか? – hola

+0

私のコードでは動作しません。たぶん、私が働いているのはクラスの関数だからです。 – Mikael

0

動作するようです一つの解決策は次のとおりです。

私が呼び出した場合

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

を追加します以下、それは動作します。

if let obj = myFunc(Car.self, ...) { 
    // obj will be of type Car 
} 

実際にはこれを達成するには多すぎるようですが、根本的な理由がある可能性があります。

関連する問題