ObjC приведение блока к типам с бесплатными мостами
Можно ли передать блок, который принимает типы Objective-C, имеющие свободные от мостов эквиваленты, непосредственно в метод, ожидающий блок с типами C?
Конкретный пример
Я оборачиваю API AddressBook и Contacts в зависимости от доступности, и фреймворки содержат два метода, которые для всех намерений и целей идентичны. Рассмотрим параметр завершения блока:
CNContactStore
"s - (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler
а также
AddressBook
"s void ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );
У меня есть блок типа void (^)(BOOL granted, NSError *error)
и было бы здорово, если бы я мог передать его ABAddressBookRequestAccessWithCompletion(...)
, Я знаю, что мог бы обернуть свой блок objc внутри блока, который принимает в качестве параметров "типы C", но это бессмысленно делать, когда типы являются бесплатными.
Конкретные вопросы
Есть ли способ привести объект типа void (^)(BOOL granted, NSError *error
печатать void(^)(bool granted, CFErrorRef error)
? Если мы можем, каков синтаксис? Каковы последствия владения в среде ARC?
1 ответ
Просто бросьте блок.
В качестве очень грубого примера:
typedef void(^InternalBlock)(bool granted, CFErrorRef error);
- (void)requestAccess:(void (^)(BOOL, NSError *))completion {
if ([CNContactStore class]) {
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:completion];
} else {
ABAddressBookRequestAccessWithCompletion(addressBook, (InternalBlock)completion);
}
}