引起递归的漩涡

时间:2019-01-13 02:52:40

标签: swift swizzling

因此,当我尝试混淆UIImage的{​​{1}}以便可以使用图像名称设置可访问性标识符时,即使我正在呼叫init(named:),这两者似乎都我的混乱方法method_exchangeImplementationftg_imageNamed(named name: String)调用我的混乱方法:init(named:)创建了一个无限循环。这是为什么?

呼叫ftg_imageNamed(named name: String)

method_exchangeImplementation

以相同方式失败的手动实施。

extension UIImage {

    static func swizzleInitImplementation() {
        let originalSelector =  #selector(UIImage.init(named:))
        let swizzledSelector = #selector(UIImage.ftg_imageNamed(named:))


        let imgSelf: AnyClass = self.classForCoder()

        guard  let originalMethod = class_getClassMethod(imgSelf, originalSelector),
            let swizzledMethod = class_getClassMethod(imgSelf, swizzledSelector) else {
                assertionFailure("The methodsw are not found")
                return
        }

        method_exchangeImplementations(originalMethod, swizzledMethod)
    }

    @objc static func ftg_imageNamed(named name: String)  {
        setAccessibilityLabel(name)
        self.ftg_imageNamed(named: name)
    }

}

1 个答案:

答案 0 :(得分:2)

self.UI(named: name)之前,您的浑身似乎“ 确定”。因此,请检查该方法是否存在无限循环问题。

现在,这是一个糟糕的实现。 UIImage.init(named:)返回UIImage的实例,纠缠的方法UIImage.ftg_imageNamed(named:)返回Void。原始方法和转换方法都应具有相同的参数和返回类型,实现可能有所不同。

您应该考虑一种简单的扩展方法来实现所需的功能,而不是费劲。

修改

extension UIImage {
    static func initIncludingAccessibility(named: String) -> UIImage {
       let img = UIImage(named: named)
       img.setAccessibilityLabel(named)
       return img
    }
}

用作

let image = UIImage.initIncludingAccessibility(named: /* your_image_name*/)