Swift 2.0 - Operatore binario “|” non può essere applicato a due operandi UIUserNotificationType


193

Sto provando a registrare la mia domanda per le notifiche locali in questo modo:

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

In Xcode 7 e Swift 2.0 - Ottengo un errore Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Mi aiuti per favore.


2
Circonda con "()" lavora per me UIApplication.sharedApplication () registerUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), categorie: zero)).
Nekak Kinich

1
Ora ho:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov il

Non ho un'altra idea, scusa.
Nekak Kinich,

Risposte:


387

In Swift 2, molti tipi per cui lo faresti normalmente sono stati aggiornati per conformarsi al protocollo OptionSetType. Ciò consente la sintassi come array per l'utilizzo e, nel tuo caso, puoi utilizzare quanto segue.

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

E su una nota correlata, se si desidera verificare se un set di opzioni contiene un'opzione specifica, non è più necessario utilizzare AND bit a bit e un controllo zero. Puoi semplicemente chiedere l'opzione impostata se contiene un valore specifico nello stesso modo in cui verifichi se un array contenesse un valore.

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

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

In Swift 3 , i campioni devono essere scritti come segue:

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

e

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

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

1
E se hai flags |= .Alert? Puoi usare flags = [flags, .Alert]?
user3246173

vale a dire, questo viene trattato come un set in cui i valori sono univoci o come una matrice che potrebbe portare a un valore finale errato?
user3246173

@ user3246173 Dipende da come viene dichiarata la variabile flags. Se il tipo di bandiera è esplicitamente dichiarato come UIUserNotificationType, ad esempio var flags: UIUserNotificationType = [.Alert, .Badge], allora sarà trattato come un insieme, e si potrebbe aggiungere un elemento mediante l'utilizzo di set di metodi di istanza piace insert(), union(), unionInPlace(), o con l'approccio che lei ha citato, senza preoccuparsi di duplicati.
Mick MacCallum

Se non dichiari esplicitamente i flag di avere il tipo UIUserNotificationTypee usi qualcosa di simile var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]nella tua dichiarazione, il tipo di flag verrà dedotto [UIUserNotificationType], e l'aggiunta di elementi tramite append()o altri metodi comporterà duplicati. Nel caso di quest'ultimo, puoi semplicemente inizializzare un'istanza UIUserNotificationTypecon l'array come input e tutto andrà bene, ma per chiarezza raccomando l'approccio basato su set.
Mick MacCallum

35

Puoi scrivere quanto segue:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)

9
Troppo complicato.
Ritorna vero

1
caspita sembra orribile! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), ma grazie per una soluzione funzionante
Chad Scira,

2
Se non sbaglio puoi scriverevar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C

7

Ciò che ha funzionato per me è stato

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)

9
sembra quasi esattamente come la risposta accettata sopra. Consideralo come un commento?
Max MacLeod,

2

Questo è stato aggiornato in Swift 3.

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.