[英]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(...)
void (^)(BOOL granted, NSError *error)
的塊,如果我可以將它傳遞給ABAddressBookRequestAccessWithCompletion(...)
那就ABAddressBookRequestAccessWithCompletion(...)
。 我知道我可以將我的 'objc' 塊包裝在一個以“C 類型”作為參數的塊中,但是當這些類型是免費橋接時,這樣做感覺毫無意義。
具體問題
有沒有辦法將類型為void (^)(BOOL granted, NSError *error
void(^)(bool granted, CFErrorRef error)
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.