如何调用原始 NSError 旋转时初始化方法?
NSError
我当前的实施
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:...) 将包含原始初始值设定项。
self.init(swizzleDomain:...)