gpt4 book ai didi

Swift objc_getAssociatedObject 始终为零

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:07 25 4
gpt4 key购买 nike

我正在尝试将属性关联到数组扩展:

private var AssociatedObjectHandle: String = "BlaBLabla"
extension Array {
var emptyIndex:Int {
mutating get {
if let object = objc_getAssociatedObject(self, &AssociatedObjectHandle) {
return object as! Int
}
let index = self.searchEmptyIndex()
self.emptyIndex = index

return index
}
set {
let new = (newValue as NSInteger)
objc_setAssociatedObject(self, &AssociatedObjectHandle, new, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}

func searchEmptyIndex() -> Int {
if let arr = self as? [Int] {
return arr.index(of: -1)!
}

return -1
}
}

objc_getAssociatedObject 调用总是返回 nil!!

有人知道为什么吗?

我在最后一个小时里一直在敲我的头......

最佳答案

不能将关联对象添加到 Swift Array(或任何 Swift 值类型)。objc_setAssociatedObject()objc_getAssociatedObject() 来自Objective-C 运行时,他们首先期望 NSObject 的实例争论。

你的代码编译和运行只是因为任何 Swift 值都是自动的必要时桥接到一个对象。

  • 当你调用 objc_setAssociatedObject(self, ...) 然后 self桥接到 NSArray 的(临时)实例,并且关联是在那个物体上制作的。

  • 稍后,当 objc_getAssociatedObject(self, ...) 被调用时,另一个 NSArray 的(临时)实例被创建,并且那个没有关联对象。

这就是您得到 nil 作为结果的原因。

关于Swift objc_getAssociatedObject 始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859413/

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