ObjC 使用免费桥接类型铸造一个块
ObjC casting a block with toll-free-bridged types
是否可以将采用 Objective-C 类型且具有免费桥接等效项的块直接传递到需要 C 类型块的方法中?
具体例子
我根据可用性封装了 AddressBook 和 Contacts API,并且框架包含两种方法,这两种方法在所有意图和目的上都是相同的。考虑完成块参数:
CNContactStore
的- (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler
和
AddressBook
的void ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );
我有一个 void (^)(BOOL granted, NSError *error)
类型的块,如果我可以将它传递给 ABAddressBookRequestAccessWithCompletion(...)
就太好了。我知道我可以将我的 'objc' 块包装在一个以 'C types' 作为参数的块中,但是当类型是免费桥接时,这样做感觉毫无意义。
具体问题
有没有办法将 void (^)(BOOL granted, NSError *error
类型的对象转换为 void(^)(bool granted, CFErrorRef error)
类型?如果可以,语法是什么? ARC 环境中所有权的含义是什么?
简单地施放方块。
作为一个非常粗略的例子:
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);
}
}
是否可以将采用 Objective-C 类型且具有免费桥接等效项的块直接传递到需要 C 类型块的方法中?
具体例子
我根据可用性封装了 AddressBook 和 Contacts API,并且框架包含两种方法,这两种方法在所有意图和目的上都是相同的。考虑完成块参数:
CNContactStore
的- (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler
和
AddressBook
的void ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );
我有一个 void (^)(BOOL granted, NSError *error)
类型的块,如果我可以将它传递给 ABAddressBookRequestAccessWithCompletion(...)
就太好了。我知道我可以将我的 'objc' 块包装在一个以 'C types' 作为参数的块中,但是当类型是免费桥接时,这样做感觉毫无意义。
具体问题
有没有办法将 void (^)(BOOL granted, NSError *error
类型的对象转换为 void(^)(bool granted, CFErrorRef error)
类型?如果可以,语法是什么? ARC 环境中所有权的含义是什么?
简单地施放方块。
作为一个非常粗略的例子:
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);
}
}