正如标题所描述的那样。我终于找到了一个通用的解决方案,并展示给大家。并希望有人能有更好的解决方案。
最佳答案
只需按照以下步骤操作即可:
class BlockWrapper<T> {
let block: T?
init (_ b: T?) { self.block = b }
}
public typealias YourBlock = (param: [String:String]) -> Bool
public typealias YourBlock2 = () -> Bool
extension UIButton {
@nonobjc static var iActionBlockKey = Int8(0);
public var actionBlock: YourBlock? {
set {
objc_setAssociatedObject(self, &UIButton.iActionBlockKey, BlockWrapper<YourBlock>(newValue), .OBJC_ASSOCIATION_RETAIN)
}
get {
let wrapper = objc_getAssociatedObject(self, &UIButton.iActionBlockKey) as? BlockWrapper<YourBlock>
return wrapper?.block
}
}
@nonobjc static var iActionBlockKey2 = Int8(0);
public var actionBlock2: YourBlock2? {
set {
objc_setAssociatedObject(self, &UIButton.iActionBlockKey2, BlockWrapper<YourBlock2>(newValue), .OBJC_ASSOCIATION_RETAIN)
}
get {
let wrapper = objc_getAssociatedObject(self, &UIButton.iActionBlockKey2) as? BlockWrapper<YourBlock2>
return wrapper?.block
}
}
}
关于ios - 如何在 Swift 中用不同的 block 实现 objc_setAssociatedObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38972138/