0

我正在使用这个开源库,它是 AddressBook.framework 的包装器。没有删除联系人的方法,所以我将使用 default ABAddressBookRemoveRecord。但是为此,我需要ABAddressBookRef.

由于它在该库 的APAddressBook.m文件中声明为并且我无法访问它,因此我想在 Swift 中编写扩展,包含返回它的方法。APAddressBook@property (nonatomic, readonly) ABAddressBookRef addressBook;

所以这是我的扩展的主体:

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 = 0as associatedKey,但调用getABAddressBook()函数总是崩溃fatal error: unexpectedly found nil while unwrapping an Optional value.

我的代码有什么问题?还有更好的方法来解决我的问题吗?

4

1 回答 1

0

好吧,也许这不是您问题的特别答案,但这里有一些想法。

您只知道要传递什么,obc_objc_getAssociatedObject因为您的库是开源的。

那么,您为什么不使用它来满足您的需求呢?

如果我是你,我只会将该物业移至公共通道。我不认为这是一个比尝试通过方法访问私有财产更糟糕的解决方案obc_

关于您的问题,您是否尝试将 addressBookRef 指定为: NSString?由于苹果现在把 swift 的 String 和 NSString 做成了两种不同的类型。

于 2015-05-27T22:19:48.027 回答