如何在 Swift 中用不同的块实现 objc_setAssociatedObject?
How to implement objc_setAssociatedObject with different block in Swift?
与标题描述的一样。我终于找到了一个通用的解决方案,并展示给大家。并希望有人能有更好的解决方案。
只需按照以下步骤操作即可:
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
}
}
}
与标题描述的一样。我终于找到了一个通用的解决方案,并展示给大家。并希望有人能有更好的解决方案。
只需按照以下步骤操作即可:
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
}
}
}