我想在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 '_?'
}
答案 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])
}