我有这样的课程。
protocol BaseProtocol {
init()
init(json : SwiftyJSON.JSON)
func create(parameter : [String : Any], url : ApiEnpoint, success:@escaping(_ responseObject: NSObject)->(),failure:@escaping(_ failedMsg:String)->())
}
class BaseModel: NSObject, BaseProtocol {
required override init() {
}
required convenience init(json: JSON) {
self.init()
}
func create(parameter: [String : Any], url: ApiEnpoint, success: @escaping (NSObject) -> (), failure: @escaping (String) -> ()) {
WebAPI.instance.requestPOSTURL(endPoint: url, parameter: parameter, success: { (response) in
success(self.init(json: response))
}) { (faile) in
failure(faile as! String)
}
}
}
class A : BaseModel {
required convenience init(json: JSON) {
self.init()
// Assign the json values
}
func createUser() {
create(parameter:pa, url:ApiEnpoint.UserRegistration, success: { (ob) in
}) { (fa) in
}
}
}
这是我正在使用的代码结构。我要访问
self.init(json: response)
在webapi块内部。但是它不起作用。有人知道吗
答案 0 :(得分:2)
除非在初始化过程中,否则无法在init
上调用self
。您只能在创建新实例时调用init
,因此需要在其前面加上类名。您可能想要这样的东西:
type(of: self).init(json: response)
但是,整个过程有点奇怪,因为您需要A
的实例才能在A
中创建createUser
的新实例。
您可能应该使create
成为class
方法,或者更确切地说,应该从API方法中适当地分离实体类。
例如,具有通用方法的服务:
class MyService {
func create<Entity: BaseProtocol>(parameter: [String: Any], url: ApiEnpoint, success: @escaping (Entity) -> (), failure: @escaping (String) -> ()) {
WebAPI.instance.requestPOSTURL(endPoint: url, parameter: parameter, success: { (response) in
success(Entity(json: response))
}) { (faile) in
failure(faile as! String)
}
}
}
(请注意,成功处理程序现在将返回正确的类型)。
您还可以使API URL成为协议的一部分(例如,作为返回URL的静态var或静态函数),因此您可以对所有实体使用一种create
方法,而无需createUser
。