用于获取实例私有属性的Swift扩展

时间:2015-05-27 21:44:01

标签: swift abaddressbook swift-extensions

我正在使用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.

崩溃

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

1 个答案:

答案 0 :(得分:0)

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

你只知道在obc_objc_getAssociatedObject传递什么,因为你的lib是开源的。

那么为什么你不能根据自己的需要使用它呢?

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

关于您的问题,您是否尝试将addressBookRef指定为: NSString?由于Apple现在使swift的String和NSString有两种不同的类型。