快速访问self.init

时间:2018-08-14 17:29:45

标签: swift

我有这样的课程。

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块内部。但是它不起作用。有人知道吗

1 个答案:

答案 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