获取实例私有属性的Swift扩展
我正在使用开源库,它是AddressBook.framework上的包装器。没有删除联系人的方法,因此我将使用默认的获取实例私有属性的Swift扩展,swift,abaddressbook,swift-extensions,Swift,Abaddressbook,Swift Extensions,我正在使用开源库,它是AddressBook.framework上的包装器。没有删除联系人的方法,因此我将使用默认的ABAddressBookRemoveRecord。但是,为此我需要ABAddressBookRef 因为它在该APAddressBook库的APAddressBook.m文件中声明为 @property(非原子,只读)ABAddressBookRef addressBook
ABAddressBookRemoveRecord
。但是,为此我需要ABAddressBookRef
因为它在该APAddressBook
库的APAddressBook.m
文件中声明为
@property(非原子,只读)ABAddressBookRef addressBook我无法访问它,我想用Swift编写扩展,包含返回它的方法
这是我扩展的主体:
extension APAddressBook {
private struct AssociatedKey {
static var addressBookRef = "addressBook"
}
var xo: ABAddressBook! {
get {
return objc_getAssociatedObject(self, &AssociatedKey.addressBookRef)
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKey.addressBookRef, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN))
}
}
func getABAddressBook() -> ABAddressBookRef {
return self.xo
}
}
我也尝试过使用私有变量xoAssociationKey:UInt8=0
作为associatedKey,但调用getABAddressBook()
函数总是会崩溃,出现致命错误:在展开可选值时意外发现nil。
我的代码怎么了?还有没有更好的方法来解决我的问题呢?也许这不是对你问题的特别回答,但这里有一些想法
您只知道在obc\u objc\u getAssociatedObject
中传递什么,因为您的库是开源的
那你为什么不用它来满足你的需要呢
如果我是你,我会把那房子搬到公共通道。我不觉得这是一个比通过obc
方法访问私有财产更糟糕的解决方案
关于您的问题,您是否尝试将addressBookRef指定为:NSString
?因为苹果现在把swift的字符串和NSString做成了两种不同的类型。Hi,你是说直接编辑库?我肯定在几个小时后就考虑过了:D但从长远来看,这不是最好的解决方案,每次他们更新库时我都会这么做。。。这就是为什么我认为我们有类别/扩展。我不明白那个弦乐部分。。。它与addressBookRef有什么关系?