So verwenden Sie CFNotificationCenterAddObserver ordnungsgemäß in Swift für iOS

Pulling meine Haare raus bekommenCFNotificationCenterAddObserver in Swift arbeiten.

        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
        UnsafePointer<Void>(self),
        iosLocked,
        "com.apple.springboard.lockcomputer" as CFString,
        nil,
        CFNotificationSuspensionBehavior.DeliverImmediately)

DasiOS docs habe es aufgelistet und ich habe unzählige Iterationen auf dem Rückruf und dem unsicheren Zeiger ohne Erfolg versucht.

Der obige Funktionsaufruf führt zu dieser Fehlermeldung, die das richtige Init zu sein scheint:

Cannot invoke 'init' with an argument list of type '(CFNotificationCenter!, $T4, () -> (), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)'

Ich habe auch versucht, als @ zu objc zu überbrückdieser Beitrag hier schlägt vor, aber ohne Erfolg.

Hier ist meine Brücke:

LockNotifierCallback.h:

#import <Foundation/Foundation.h>

@interface LockNotifierCallback : NSObject

+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc;

@end

und 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

mit aktualisiertem CFNotificationCenterAddObserver-Aufruf wie folgt:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
        LockNotifierCallback.notifierProc,
        iosLocked,
        "com.apple.springboard.lockcomputer" as CFString,
        nil,
        CFNotificationSuspensionBehavior.DeliverImmediately)

und natürlich ist LockNotifierCallback.h in meinem Bridging-Header. Fehler weiterhin:

Cannot convert the expression's type '(CFNotificationCenter!, () -> CFunctionPointer<((CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void)>, () -> (), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)' to type 'StringLiteralConvertible'

Antworten auf die Frage(1)

Ihre Antwort auf die Frage