gpt4 book ai didi

ios - 将遵循给定协议(protocol)的类传递给方法,然后使用 swift 实例化该类

转载 作者:行者123 更新时间:2023-11-30 13:02:00 25 4
gpt4 key购买 nike

我希望创建一个非常通用的服务层来调用 Alamofire。参见代码:

func getRequest(from endpoint:String!, withParameters parameters:[String:Any]?,withModel model:RuutsBaseResponse, andCompleteWith handler:@escaping (RuutsBaseResponse?, NSError?) -> ()){

func generateModel(withResponse result:NSDictionary?, withError error:NSError?) -> (){
handler(model.init(fromDictionary: result),error);
}

alamoFireService.AlamoFireServiceRequest(endpoint:endpoint, httpVerb:.get, parameters:parameters!, completionHandler:generateModel);
}

这就是 RuutsBaseResponse 的样子:

protocol RuutsBaseResponse {
init(fromDictionary dictionary: NSDictionary);
}

getRequest 看起来会执行以下操作:

  1. 可以在任何类中使用,只要它符合 RuutsBaseResponse 协议(protocol)即可。
  2. 使用传入的参数使用 alamoFire 进行服务调用。
  3. 一旦服务调用完成,alamoFire 将调用generateModel 方法。
  4. 当它调用generateModel时,该方法应该实例化模型并将从 alamoFire 接收到的字典传递给它。

问题是模型,我正在努力实现上述要求。我不断得到:

Error:(22, 21) 'init' is a member of the type; use 'type(of: ...)' to initialize a new object of the same dynamic type

我想要做的就是使一个层足够通用以进行服务调用并创建一个对象/模型,该对象/模型是根据从 alamoFire 传回的字典创建的。

最佳答案

您正在寻找的是如何使用Generics :

protocol RuutsBaseResponse {
init(fromDictionary dictionary: NSDictionary);
}

struct BaseModel: RuutsBaseResponse {
internal init(fromDictionary dictionary: NSDictionary) {
print("instantiated BaseModel")
}
}

struct SecondaryModel: RuutsBaseResponse {
internal init(fromDictionary dictionary: NSDictionary) {
print("instantiated SecondaryModel")
}
}

// state that this function handles generics that conform to the RuutsBaseResponse
// protocol
func getRequest<T: RuutsBaseResponse>(handler: (_ response: T) -> ()) {
handler(T(fromDictionary: NSDictionary()))
}

getRequest(handler: { model in
// will print 'instantiated BaseModel'
(model as! BaseModel)
})

getRequest(handler: { model in
// will print 'instantiated SecondaryModel'
(model as! SecondaryModel)
})

关于ios - 将遵循给定协议(protocol)的类传递给方法,然后使用 swift 实例化该类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com