Swift - 使用协议通用类型初始化类

时间:2017-03-26 18:48:05

标签: ios json swift generics

我想调用这样的方法:

createModel(Model.Type, json)

该函数应该在参数中调用给定类型的构造函数。构造函数在协议中定义(来自ObjectMapper)。我对swift中的泛型类型并不熟悉。这是我到目前为止所做的,但它不起作用。

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

1 个答案:

答案 0 :(得分:3)

我在评论中对此进行了描述。您的代码中有一些情况是您可以互换使用JSON和json。在代码中,我使用JSON来识别类型别名,使用json作为变量名称。在参数列表

中,Swift中的格式也是varName: type
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])