Быстрое расширение для получения экземпляра частной собственности
Я использую эту библиотеку с открытым исходным кодом, которая является оберткой на 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 двух разных типов.