Swift 2.0 - Binäroperator "|" kann nicht auf zwei UIUserNotificationType-Operanden angewendet werden

193

Ich versuche, meine Bewerbung für lokale Benachrichtigungen folgendermaßen zu registrieren:

UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))

In Xcode 7 und Swift 2.0 - bekomme ich Fehler Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Bitte hilf mir.

Nikita Zernov
quelle
2
Surrounds with "()" funktioniert für mich UIApplication.sharedApplication (). RegisterUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), Kategorien: nil))
Nekak Kinich
1
Jetzt habe ich:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov
Ich habe keine andere Idee, sorry.
Nekak Kinich

Antworten:

387

In Swift 2 wurden viele Typen, für die Sie dies normalerweise tun würden, aktualisiert, um dem OptionSetType-Protokoll zu entsprechen. Dies ermöglicht eine Array-ähnliche Syntax für die Verwendung. In Ihrem Fall können Sie Folgendes verwenden.

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)

Wenn Sie überprüfen möchten, ob ein Optionssatz eine bestimmte Option enthält, müssen Sie in diesem Zusammenhang nicht mehr bitweises UND und keine Prüfung verwenden. Sie können den Optionssatz einfach fragen, ob er einen bestimmten Wert enthält, genauso wie Sie prüfen würden, ob ein Array einen Wert enthält.

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge], categories: nil)

if settings.types.contains(.Alert) {
    // stuff
}

In Swift 3 müssen die Beispiele wie folgt geschrieben werden:

let settings = UIUserNotificationSettings(types: [.alert, .badge], categories: nil)
UIApplication.shared.registerUserNotificationSettings(settings)

und

let settings = UIUserNotificationSettings(types: [.alert, .badge], categories: nil)

if settings.types.contains(.alert) {
    // stuff
}
Mick MacCallum
quelle
1
Was ist, wenn Sie haben flags |= .Alert? können Sie verwenden flags = [flags, .Alert]?
user3246173
dh Wird dies wie ein Set behandelt, bei dem Werte eindeutig sind, oder wie ein Array, das möglicherweise zu einem falschen Endwert führen kann?
user3246173
@ user3246173 Es hängt davon ab, wie die Flags-Variable deklariert wird. Wenn Typ Flagge explizit als deklariert wird UIUserNotificationType, das heißt var flags: UIUserNotificationType = [.Alert, .Badge], dann wird es wie ein Satz behandelt werden, und Sie könnten ein Element entweder hinzufügen , indem Sie mit Set Instanzmethoden wie insert(), union(), unionInPlace()oder mit dem Ansatz , dass Sie , ohne sich um Duplikate erwähnt.
Mick MacCallum
Wenn Sie Flags nicht explizit als Typ deklarieren UIUserNotificationTypeund so etwas wie var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]in Ihrer Deklaration verwenden, wird auf den Typ des Flags geschlossen [UIUserNotificationType], und das Hinzufügen von Elementen über append()oder über andere Methoden führt zu Duplikaten. Im letzteren Fall können Sie einfach eine Instanz von UIUserNotificationTypemit dem Array als Eingabe initialisieren, und alles wird gut, aber ich empfehle den satzbasierten Ansatz aus Gründen der Übersichtlichkeit.
Mick MacCallum
35

Sie können Folgendes schreiben:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
quelle
9
Viel zu kompliziert.
Rückgabe wahr
1
wow das sieht schrecklich aus! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), aber danke für eine funktionierende Lösung
Chad Scira
2
Wenn ich mich nicht irre, können Sie schreibenvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C
7

Was für mich funktioniert hat war

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
quelle
9
sieht fast genauso aus wie die oben akzeptierte Antwort. Als Kommentar betrachten?
Max MacLeod
2

Dies wurde in Swift 3 aktualisiert.

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
CodeSteger
quelle