Swift 2.0 - Opérateur binaire «|» ne peut pas être appliqué à deux opérandes UIUserNotificationType

193

J'essaie d'enregistrer ma candidature pour les notifications locales de cette façon:

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

Dans Xcode 7 et Swift 2.0 - je reçois une erreur Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Aidez-moi, s'il vous plaît.

Nikita Zernov
la source
2
Entoure de "()" fonctionne pour moi UIApplication.sharedApplication (). RegisterUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), catégories: nil))
Nekak Kinich 16
1
Maintenant, j'ai:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov
Je n'ai pas d'autre idée, désolé.
Nekak Kinich

Réponses:

387

Dans Swift 2, de nombreux types pour lesquels vous effectuez généralement cette opération ont été mis à jour pour se conformer au protocole OptionSetType. Cela permet une syntaxe de type tableau pour l'utilisation, et dans votre cas, vous pouvez utiliser ce qui suit.

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

Et sur une note connexe, si vous voulez vérifier si un jeu d'options contient une option spécifique, vous n'avez plus besoin d'utiliser ET au niveau du bit et une vérification nulle. Vous pouvez simplement demander au jeu d'options s'il contient une valeur spécifique de la même manière que vous vérifieriez si un tableau contenait une valeur.

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

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

Dans Swift 3 , les échantillons doivent être écrits comme suit:

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

et

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

if settings.types.contains(.alert) {
    // stuff
}
Mick MacCallum
la source
1
Et si vous en avez? flags |= .Alert? Pouvez-vous l'utiliser flags = [flags, .Alert]?
user3246173
c'est-à-dire est-ce traité comme un ensemble où les valeurs sont uniques ou comme un tableau qui pourrait éventuellement conduire à une valeur finale incorrecte?
user3246173
@ user3246173 Cela dépend de la façon dont la variable flags est déclarée. Si le type de drapeau est explicitement déclaré que UIUserNotificationType, par exemple var flags: UIUserNotificationType = [.Alert, .Badge], il sera traité comme un ensemble, et vous pouvez ajouter un élément soit en utilisant ensemble les méthodes d'instance aiment insert(), union(), unionInPlace()ou avec l'approche que vous avez mentionné sans se soucier de doublons.
Mick MacCallum
Si vous ne déclarez pas explicitement les indicateurs comme ayant le type UIUserNotificationTypeet utilisez quelque chose comme var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]dans votre déclaration, alors le type de l'indicateur sera inféré [UIUserNotificationType]et l'ajout d'éléments à celui-ci via append()ou d'autres méthodes entraînera des doublons. Dans le cas de ce dernier, vous pouvez simplement initialiser une instance de UIUserNotificationTypeavec le tableau en entrée et tout ira bien, mais je recommande l'approche basée sur l'ensemble pour plus de clarté.
Mick MacCallum
35

Vous pouvez écrire ce qui suit:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
la source
9
Beaucoup trop compliqué.
retour vrai
1
wow cela a l'air hideux! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), mais merci pour une solution de travail
Chad Scira
2
Si je ne me trompe pas, vous pouvez écrirevar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C
7

Ce qui a fonctionné pour moi était

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
la source
9
ressemble presque exactement à la réponse acceptée ci-dessus. Considérer comme un commentaire?
Max MacLeod
2

Cela a été mis à jour dans Swift 3.

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