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);
    }

}
Другие вопросы по тегам