簡體   English   中英

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

AddressBookvoid 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM