gpt4 book ai didi

ios - 在 Swift 中为文字值设置关联对象

转载 作者:搜寻专家 更新时间:2023-11-01 06:10:02 25 4
gpt4 key购买 nike

好吧,这可能是一个重复的问题。
我发现了一些这样的问题: Is there a way to set associated objects in Swift?

但是,我想将 Int 属性添加到 swift 的 extension 中,上面链接中的这些答案不起作用。

这是我的代码:

import ObjectiveC
var xoAssociationKey: UInt8 = 0

extension NSData {

var position: Int {
get {
return objc_getAssociatedObject(self, &xoAssociationKey) as Int
}
set {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
}

override convenience init() {
self.init()
position = 0
}
}

每次访问 position 时,我都会收到 fatal error: unwrappedly found nil while unwrapping an Optional value

仅供引用,我确实在 Objective C 中找到了针对此错误的解决方案,我正在寻找一个快速的解决方案。如果您感兴趣,这是我在 objective-c 中的代码:

static char PROPERTY_KEY;

@implementation NSData (Extension)
@dynamic position;
- (NSInteger)position {
return [objc_getAssociatedObject(self, &PROPERTY_KEY) integerValue];
}
- (void)setPosition:(NSInteger)position {
// Must convert to an object for this trick to work
objc_setAssociatedObject(self, &PROPERTY_KEY, @(position), OBJC_ASSOCIATION_COPY);
}

- (instancetype)init {
self = [super init];
if (self) {
self.position = 0;
}
return self;
}

最佳答案

NSData 是类簇的一部分,因此不一定会调用您的自定义 init 方法,例如

let d = NSMutableData()

不使用您的init 方法。下一个问题是您的 init 方法调用本身递归,因此

let d = NSData()

因堆栈溢出而崩溃。另请注意,Objective-C 代码依赖于未定义的行为,因为它替换了类扩展中的方法。

所以最好删除您的自定义初始化,并将 getter 更改为如果尚未设置关联对象,则返回默认值。这可以通过可选的转换 (as?Int) 和零合并运算符(??):

extension NSData {

var position: Int {
get {
return objc_getAssociatedObject(self, &xoAssociationKey) as? Int ?? 0
}
set {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
}
}

关于ios - 在 Swift 中为文字值设置关联对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27635117/

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