Я использую библиотеку с открытым исходным кодом 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
в associatedKey, но называть getABAddressBook()
функции всегда падает с fatal error: unexpectedly found nil while unwrapping an Optional value.
Что случилось с моим кодом? Также есть лучший способ решить мою проблему?
Привет, вы имеете в виду прямое редактирование библиотеки? Я, конечно же, подумал об этом через несколько часов: D, но с долгосрочной точки зрения это не лучшее решение, мне придется делать это каждый раз, когда они обновляют библиотеку ... вот почему у меня есть категории/расширения, которые я думаю. Я не получаю эту String часть ... что это имеет отношение к addressBookRef? –