ios - 如何在 Swift 中用不同的 block 实现 objc_setAssociatedObject?

标签 ios swift runtime block

正如标题所描述的那样。我终于找到了一个通用的解决方案,并展示给大家。并希望有人能有更好的解决方案。

最佳答案

只需按照以下步骤操作即可:

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/

相关文章:

ios - 使 2 UIScrollView 缩放和滚动相同

iOS 10 和为属性文本设置自定义字体

ios - 通过 resignFirstResponder 隐藏由 textField 触发的键盘

Java - 代码可以编译,但整个代码无法运行

java - 在运行时动态更改 JButton 属性

java - 如何从 Java JAR 文件调用 Python 脚本

ios - 创建固定长度字符串函数(最初来自Java)

ios - 如何在iOS上绘制二维正方形矩阵?

ios - 如何根据按钮框架正确计算 cornerRadius

ios - Swift didSet on UICollectionViewCell 属性运行,但不更新 UI