Swift 2.0 - Operador binario "|" no se puede aplicar a dos operandos UIUserNotificationType

193

Estoy tratando de registrar mi solicitud de notificaciones locales de esta manera:

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

En Xcode 7 y Swift 2.0, recibo un error Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Por favor, ayúdame.

Nikita Zernov
fuente
2
Rodea con "()" funciona para mí UIApplication.sharedApplication (). RegisterUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), categorías: nil))
Nekak Kinich
1
Ahora tengo:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov
No tengo otra idea, lo siento.
Nekak Kinich

Respuestas:

387

En Swift 2, muchos tipos para los que normalmente haría esto se han actualizado para cumplir con el protocolo OptionSetType. Esto permite una sintaxis de tipo matriz para su uso, y en su caso, puede usar lo siguiente.

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

Y en una nota relacionada, si desea verificar si un conjunto de opciones contiene una opción específica, ya no necesita usar AND bit a bit y una verificación nula. Simplemente puede preguntarle al conjunto de opciones si contiene un valor específico de la misma manera en que verificaría si una matriz contiene un valor.

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

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

En Swift 3 , las muestras deben escribirse de la siguiente manera:

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

y

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

if settings.types.contains(.alert) {
    // stuff
}
Mick MacCallum
fuente
1
¿Qué pasa si tienes flags |= .Alert? ¿Puedes usar flags = [flags, .Alert]?
user3246173
es decir, ¿se trata como un conjunto donde los valores son únicos o como una matriz que podría conducir a un valor final incorrecto?
user3246173
@ user3246173 Depende de cómo se declare la variable flags. Si el tipo de marca se declara explícitamente como UIUserNotificationType, es decir var flags: UIUserNotificationType = [.Alert, .Badge], se tratará como un conjunto, y puede agregar un elemento utilizando métodos de instancia de conjunto como insert(),union() , unionInPlace(), o con el enfoque que usted ha mencionado sin preocuparse de los duplicados.
Mick MacCallum
Si no declara explícitamente que las banderas tengan el tipo UIUserNotificationType y usas algo como var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]en tu declaración, entonces se inferirá que el tipo de bandera es [UIUserNotificationType], y agregarle elementos a través de él append()u otros métodos dará como resultado duplicados. En el caso de este último, simplemente puede inicializar una instancia UIUserNotificationTypecon la matriz como entrada y todo estará bien, pero recomiendo el enfoque basado en conjuntos para mayor claridad.
Mick MacCallum
35

Puedes escribir lo siguiente:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
fuente
9
Demasiado complicado.
Vuelve el verdadero
1
wow esto se ve horrible! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), pero gracias por una solución de trabajo
Chad Scira
2
Si no me equivoco, puede escribirvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C
7

Lo que funcionó para mí fue

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
fuente
9
se ve casi exactamente como la respuesta aceptada arriba. Considerar como un comentario?
Max MacLeod
2

Esto se ha actualizado en Swift 3.

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