2015-05-27 3 views
0

Я использую библиотеку с открытым исходным кодом 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.

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

ответ

0

Возможно, это не ответ на ваши вопросы, но вот некоторые мысли.

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

Так почему бы вам не использовать это, чтобы оно соответствовало вашим потребностям?

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

Что касается вашего вопроса, вы попытались указать адресBookRef как : NSString? Поскольку Apple теперь создала строки Swift и NSString двумя разными типами.

+0

Привет, вы имеете в виду прямое редактирование библиотеки? Я, конечно же, подумал об этом через несколько часов: D, но с долгосрочной точки зрения это не лучшее решение, мне придется делать это каждый раз, когда они обновляют библиотеку ... вот почему у меня есть категории/расширения, которые я думаю. Я не получаю эту String часть ... что это имеет отношение к addressBookRef? –

Смежные вопросы