2016-10-19 2 views
1

Я пытаюсь прослушивать уведомления CoreTelephony с помощью функции (теперь закрытой) CTTelephonyCenterAddObserver C и CFNotificationCallback блоков обратного вызова.Использование CFNotificationCallback в Swift, или, @convention (c) блоки в Swift

Мой шунтирующий заголовок (в Экстерн частные функции C):

#include <CoreFoundation/CoreFoundation.h> 

#if __cplusplus 
extern "C" { 
#endif 

#pragma mark - API 

    /* This API is a mimic of CFNotificationCenter. */ 

    CFNotificationCenterRef CTTelephonyCenterGetDefault(); 
    void CTTelephonyCenterAddObserver(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior); 
    void CTTelephonyCenterRemoveObserver(CFNotificationCenterRef center, const void *observer, CFStringRef name, const void *object); 
    void CTTelephonyCenterRemoveEveryObserver(CFNotificationCenterRef center, const void *observer); 

    void CTIndicatorsGetSignalStrength(long int *raw, long int *graded, long int *bars); 

#pragma mark - Definitions 

    /* For use with the CoreTelephony notification system. */ 
    extern CFStringRef kCTIndicatorsSignalStrengthNotification; 

#if __cplusplus 
} 
#endif 

Мой Swift код:

let callback: CFNotificationCallback = { (center: CFNotificationCenter?, observer: UnsafeRawPointer?, name: CFString?, object: UnsafeRawPointer?, info: CFDictionary?) -> Void in 
    // ... 
} 

CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault().takeUnretainedValue(), nil, callback, kCTIndicatorsSignalStrengthNotification.takeUnretainedValue(), nil, .coalesce) 

Однако, я не могу получить подпись моей completion переменной, чтобы соответствовать требования к титалиам CFNotificationCallback.

Cannot convert value of type 
'(CFNotificationCenter?, UnsafeRawPointer?, CFString?, UnsafeRawPointer?, CFDictionary?) -> Void' 
to specified type 
'CFNotificationCallback' (aka '@convention(c) (Optional<CFNotificationCenter>, Optional<UnsafeMutableRawPointer>, Optional<CFNotificationName>, Optional<UnsafeRawPointer>, Optional<CFDictionary>) ->()') 

Как я могу получить @convention(c) закрытия, чтобы играть хорошо в Swift?

+1

Он не компилируется, потому что 'observer' является' UnsafeMutableRawPointer', а не 'UnsafeRawPointer'. –

ответ

1

Позволить компилятор Infer подписи закупоривающей работает отлично:

let callback: CFNotificationCallback = { center, observer, name, object, info in 
    //works fine 
} 

Попытка указать @convention(c) в декларации закупоривающей выдает ошибку:

let callback: CFNotificationCallback = { @convention(c) (center: CFNotificationCenter?, observer: UnsafeRawPointer?, name: CFString?, object: UnsafeRawPointer?, info: CFDictionary?) -> Void in 
    //Attribute can only be applied to types, not declarations. 
} 

Похоже, что происходит, что когда вы вручную объявить тип закрытия, он заставляет компилятор использовать этот точный тип. Но это технически декларация закрытия, а не объявление типа, поэтому атрибут @convention не разрешен. Когда компилятору разрешено выводить тип закрытия (из типа переменной, в которой он хранится), он также может вывести атрибут.

+0

А, так оно и есть, я был слишком оскорбительным. Благодаря! – JAL

Смежные вопросы