ios - 如何在不进入无限循环的情况下调配 NSError init

标签 ios swift nserror method-swizzling

swizzling时如何调用原来的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.. 
    }
}

最佳答案

你已经交换了实现,这意味着你必须调用:

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

因为 self.init(swizzleDomain:...) 将包含原始初始化程序。

关于ios - 如何在不进入无限循环的情况下调配 NSError init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53987373/

相关文章:

ios - 重用同一个 NSError 对象会不会有问题?

ios - Heroku 偶尔返回 "hostname"not found

ios - 在 iOS 9.3/Xcode 7.3 中使用 StoreKit 常量时使用未解析的标识符

swift - Swift 中的接口(interface)模拟用于回调实现

ios - 从多个类swift继承的替代方法

swift - 如何制作全类ID号

ios - iOS (iPhone/iPad) 中的串行或 HID (usb) 通信

iphone - 如何从函数写入.csv文件?

ios - 使用 InAppSettingsKit 本地化 Settings.bundle 中的字符串

ios - Swift 如何重构从 API 获取数据?