我正在使用this开源库,它是AddressBook.framework的包装器。没有删除联系人的方法,所以我将使用默认ABAddressBookRemoveRecord
。但是,我需要ABAddressBookRef
。
因为它在APAddressBook.m
库的APAddressBook
文件中声明为
@property (nonatomic, readonly) 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
}
}
我也尝试将private var xoAssociationKey: UInt8 = 0
用作关联键,但调用getABAddressBook()
函数始终与fatal error: unexpectedly found nil while unwrapping an Optional value.
我的代码出了什么问题?还有更好的方法来解决我的问题吗?
答案 0 :(得分:0)
好吧也许这不是你的问题的答案,但这里有一些想法。
你只知道在obc_objc_getAssociatedObject
传递什么,因为你的lib是开源的。
那么为什么你不能根据自己的需要使用它呢?
如果我是你,我只是将该财产移至公众访问。我认为这不是一个比通过obc_
方法访问私有财产更糟糕的解决方案。
关于您的问题,您是否尝试将addressBookRef指定为: NSString
?由于Apple现在使swift的String和NSString有两种不同的类型。