2017-03-26 18 views
0

でジェネリック型でクラスを初期化:スウィフトは - 私はこのようなメソッドを呼び出したいプロトコル

createModel(Model.Type, json) 

関数は、パラメータで指定された型のコンストラクタを呼び出す必要があります。コンストラクタは、(ObjectMapperの)プロトコルで定義されています。私は迅速なジェネリック型に精通していません。これは私がこれまで持っているものですが、うまくいかないものです。

func createModel<T: Mappable>(model: T.Type, json: JSON){ 
    return model(JSON: json) 
} 
+0

にあなたは戻り値の型が欠落している場合もスウィフトでのフォーマットがvarName: typeです。 –

答えて

2

ここではコメントで説明しました。そこにいくつかのケースでは、あなたのコードにあったあなたは、交換可能にJSONとJSONを使用していたました。コードでは、私は変数名としてタイプエイリアスとJSONを識別するためにJSONを使用します。 ( - あなたの関数へ> T '、すなわち、追加 `)パラメータリスト

typealias JSON = [String: Any] // Assuming you have something like this 

// Assuming you have this 
protocol Mappable { 
    init(json: JSON) // format = init(nameOfVariable: typeOfVariable) 
} 

class Model: Mappable { 
    required init(json: JSON) { 
     print("a") // actually initialize it here 
    } 
} 

func createModel<T: Mappable>(model: T.Type, json: JSON) -> T { 
    // Initializing from a meta-type (in this case T.Type that we int know) must explicitly use init. 
    return model.init(json: json) // the return type must be T also 
} 

// use .self to get the Model.Type 
createModel(model: Model.self, json: ["text": 2]) 
+0

作品の魅力のように。ありがとうございました –

関連する問題