iOS Generic swift关闭

时间:2018-01-24 07:55:31

标签: ios swift generics

我想在swift中传递一个通用的模型对象。

目前我有一个必须返回Model对象的闭包,如下所示

  completionHandler = ([ModelObject]?, Error?) -> Void

方法调用

func method1( onCompletion: @escaping completionHandler) -> Void {

}

我想制作一个通用的完成处理程序,它可以传递不同的模型而不是特定的模型。 注意: - 所有模型对象都符合Codable协议,如下所示

struct ModelObject: Codable {
}

// =====编辑======

func method1<M: Codable>( onCompletion: @escaping (M?, Error?) -> Void) -> Void {
            let decoder = JSONDecoder()
            let items = try? decoder.decode(ModelObject.self, from: data)
            onCompletion(items, nil)// error in this line Cannot convert value of type 'ModelObject?' to expected argument type '_?'
}

2 个答案:

答案 0 :(得分:2)

您可以创建类似的方法:

func method1<Model: Codable>(onCompletion: @escaping (Model?, Error?) -> Void) -> Void {
    let decoder = JSONDecoder()
    let itemObj = try? decoder.decode(Model.self, from: data)
    onCompletion(itemObj, nil)
}

如果您的结构如下:

struct ModelObject: Codable {
}

您可以将此方法称为:

method1 { (model: ModelObject?, error) in

}

你有另一个结构:

struct AnotherModelObject: Codable {
}

你可以这样称呼:

method1 { (model: AnotherModelObject?, error) in

}

答案 1 :(得分:1)

您可以在其他结构中隐藏协议,也可以使用自定义容器。

protocol Container { }
struct Storage {
    let model: Codable
}
struct ModelObject: Codable, Container {
}
enum Result<T> {
    case data(result: T)
}
typealias completionHandler = ([Storage]?, Error?) -> Void

func method1(onCompletion: @escaping completionHandler) -> Void {
    onCompletion([Storage(model:ModelObject())], nil)
}
func method2(onCompletion: @escaping ([Result<Codable>]) -> Void) -> Void {
    onCompletion([Result.data(result: ModelObject() as Codable)])
}
method1 { result, _ in
    print(result![0].model)
}
method2 { result in
    print(result[0])
}