Как прокрутить инициализацию NSError, не прерывая бесконечный цикл - PullRequest
0 голосов
/ 31 декабря 2018

Как вызвать оригинальный метод NSError init при простуде?

Моя текущая реализация

 extension NSError {

    @objc class func errorSwizzle() {
        guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
            let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
        method_exchangeImplementations(instance, swizzleInstance)
    }

    @objc class func errorUnSwizzle() {
        guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
            let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
        method_exchangeImplementations(swizzleInstance, instance)
    }

    @objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {

        /// infinite loop as it calls the swizzled init again.
        self.init(domain: swizzleDomain, code: code, userInfo: info)

        /// Do something.. 
    }
}

1 Ответ

0 голосов
/ 31 декабря 2018

Вы обменялись реализациями, это означает, что вы должны позвонить:

@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
    self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}

Поскольку self.init(swizzleDomain:...) будет содержать исходный инициализатор.

...