Wyciągając moje włosy, uzyskując CFNotificationCenterAddObserver
do pracy w Swift.Jak prawidłowo korzystać z narzędzia CFNotificationCenterAddObserver w Swift na iOS
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
UnsafePointer<Void>(self),
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
iOS docs ma go na liście i próbowałem niezliczone iteracji na zwrotnego i niebezpiecznego wskaźnik bez powodzenia.
Powyższe wyniki wywołania funkcji w tym komunikatem o błędzie, który wydaje się być prawidłowa startowych:
Cannot invoke 'init' with an argument list of type '(CFNotificationCenter!, $T4,() ->(), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)'
Próbowałem też pomostowego do objc jak this post here sugeruje, ale bez powodzenia.
Oto mój most:
LockNotifierCallback.h:
#import <Foundation/Foundation.h>
@interface LockNotifierCallback : NSObject
+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc;
@end
i LockNotifierCallback.m:
#import "LockNotifierCallback.h"
static void lockcompleteChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSLog(@"success");
}
@implementation LockNotifierCallback
+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc {
return lockcompleteChanged;
}
@end
aktualne wezwanie CFNotificationCenterAddObserver następująco:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
LockNotifierCallback.notifierProc,
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
i oczywiście LockNotifierCallback.h jest w moim nagłówku Bridging. Błąd kontynuuje:
Cannot convert the expression's type '(CFNotificationCenter!,() -> CFunctionPointer<((CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void)>,() ->(), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)' to type 'StringLiteralConvertible'
'CFNotificationCenterAddObserver' zajmuje' CFunctionPointer' który tak naprawdę nie możesz stworzyć z Swift (zobacz http://stackoverflow.com/a/25514748/3300036). Możesz obejść to, wykonując jakiś Objective-C, który jest podobny do tego: http://stackoverflow.com/a/26139259/3300036 –
Dzięki Mark, ale dlaczego miałby być pod szybką deklaracją w dokumentach ios? https://developer.apple.com/Library/ios/documentation/CoreFoundation/Reference/CFNotificationCenterRef/index.html#//apple_ref/c/func/CFNotificationCenterAddObserver – zooster
Nadal można go używać od Swift, wystarczy go przekazać funkcja zdefiniowana w C lub Objective-C, a nie funkcja Swift zamknięcia. –