因此,当我尝试混淆UIImage
的{{1}}以便可以使用图像名称设置可访问性标识符时,即使我正在呼叫init(named:)
,这两者似乎都我的混乱方法method_exchangeImplementation
和ftg_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)
}
}
答案 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*/)