如何在不进入无限循环的情况下调配 NSError init
How to swizzle NSError init without hitting an infinite loop
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:...)
将包含原始初始化程序。
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:...)
将包含原始初始化程序。