gpt4 book ai didi

ios - 如何快速将 void block 传递给 objc_setAssociatedObject

转载 作者:搜寻专家 更新时间:2023-10-31 21:50:03 24 4
gpt4 key购买 nike

我正在尝试通过扩展向 UIView 添加点击手势支持。这使用 Objective-C 非常简单,但是当我尝试在运行时属性上设置 void 返回 block 时出现以下错误。

error: type '() -> Void' does not conform to protocol 'AnyObject'

这是计算属性:

var tapAction: (() -> Void)? {

get {
objc_getAssociatedObject(self, &AssociatedKeys.SNGLSActionHandlerTapBlockKey)
}

set {

objc_setAssociatedObject(
self,
&AssociatedKeys.SNGLSActionHandlerTapBlockKey,
newValue,
UInt(OBJC_ASSOCIATION_COPY_NONATOMIC)
)
}
}

我尝试将 tapAction 设置为 typealias,但仍然收到相同的错误。

最佳答案

问题是闭包不是符合 AnyObject 的对象,所以你不能像 Swift 那样存储它们。

您可以考虑将闭包包装在一个具有单个属性的类中。像这样的东西:

class ClosureWrapper {
var closure: (() -> Void)?

init(_ closure: (() -> Void)?) {
self.closure = closure
}
}

var tapAction: (() -> Void)? {
get {
if let cl = objc_getAssociatedObject(self, "key") as? ClosureWrapper {
return cl.closure
}
return nil
}

set {
objc_setAssociatedObject(
self,
"key",
ClosureWrapper(newValue),
UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)
)
}
}

它有点难看,可以使用一个不错的typealias,但这是一种实现方式。

关于ios - 如何快速将 void block 传递给 objc_setAssociatedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29106891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com