/ / Swift extension do pobierania własności prywatnej instancji - swift, abaddressbook, swift-extensions

Rozszerzenie Swift do uzyskiwania własności prywatnej instancji - swift, abaddressbook, swift-extensions

Używam to biblioteka open source, która jest opakowaniem w AddressBook.framework. Nie ma metody usuwania kontaktu, więc użyję domyślnego ABAddressBookRemoveRecord. Jednak do tego potrzebuję ABAddressBookRef.

Ponieważ jest to zadeklarowane w APAddressBook.m plik tego APAddressBook biblioteka jako @property (nonatomic, readonly) ABAddressBookRef addressBook; i nie jestem w stanie uzyskać do niego dostępu, chciałem napisać rozszerzenie w Swift, zawierające metodę zwracania go.

Jest to więc część mojego rozszerzenia:

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
}

}

Próbowałem również używać private var xoAssociationKey: UInt8 = 0 jako connectedKey, ale wywołanie getABAddressBook() funkcja zawsze zawiesza się fatal error: unexpectedly found nil while unwrapping an Optional value.

Co jest nie tak z moim kodem? Czy istnieje również lepszy sposób na rozwiązanie mojego problemu?

Odpowiedzi:

0 dla odpowiedzi № 1

Może to nie jest szczególnie odpowiedź na twoje pytania, ale oto kilka myśli.

Wiesz tylko, co przekazać obc_objc_getAssociatedObject ponieważ twoja lib jest open source.

Dlaczego więc nie użyłbyś tego, aby dopasować go do twoich potrzeb?

Gdybym był tobą, po prostu przeniosłem tę nieruchomość do publicznego dostępu. Nie uważam tego za naprawdę gorsze rozwiązanie niż próba dostępu do własności prywatnej przez obc_ metody.

Jeśli chodzi o twoje pytanie, czy próbowałeś określić addressBookRef jako : NSString? Ponieważ firma Apple stworzyła teraz Swift String i NSString dwa różne typy.