Быстрое расширение для получения экземпляра частной собственности

Я использую эту библиотеку с открытым исходным кодом, которая является оберткой на 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 asagedKey, но звонит getABAddressBook() функция всегда падает с fatal error: unexpectedly found nil while unwrapping an Optional value.

Что не так с моим кодом? Также есть лучший способ решить мою проблему?

1 ответ

Ну, может быть, это не особенно ответ на ваши вопросы, но вот некоторые мысли.

Вы знаете только, что передать obc_objc_getAssociatedObject потому что ваша библиотека с открытым исходным кодом.

Так почему бы вам не использовать это для своих нужд?

Если бы я был тобой, я бы просто перевел эту собственность в открытый доступ. Я не считаю это действительно худшим решением, чем пытаться получить доступ к частной собственности через obc_ методы.

Относительно вашего вопроса вы пытались указать addressBookRef как : NSString? Так как Apple теперь делает Swift's String и NSString двух разных типов.

Другие вопросы по тегам