代码之家  ›  专栏  ›  技术社区  ›  Tal Zion

如何在不碰到无限循环的情况下快速处理nserror init

  •  0
  • Tal Zion  · 技术社区  · 6 年前

    如何调用原始 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.. 
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Sulthan    6 年前

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

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

    因为 self.init(swizzleDomain:...) 将包含原始初始值设定项。