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.


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
}

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)

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)

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.