Swift 2.0 - Operador binário “|” não pode ser aplicado a dois operandos UIUserNotificationType

193

Estou tentando registrar meu aplicativo para notificações locais desta maneira:

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

No Xcode 7 e no Swift 2.0 - eu recebo um erro Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Por favor me ajude.

Nikita Zernov
fonte
2
Rodeia com "()" funciona para mim UIApplication.sharedApplication () registerUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), categorias: nil)).
Nekak Kinich
1
Agora eu tenho:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov
Não tenho outra ideia, desculpe.
Nekak Kinich

Respostas:

387

No Swift 2, muitos tipos para os quais você normalmente faria isso foram atualizados para estar em conformidade com o protocolo OptionSetType. Isso permite uma matriz como sintaxe para uso e, no seu caso, você pode usar o seguinte.

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

E em uma nota relacionada, se você deseja verificar se um conjunto de opções contém uma opção específica, não precisa mais usar AND bit a bit e uma verificação nula. Você pode simplesmente perguntar ao conjunto de opções se ele contém um valor específico da mesma maneira que você verificaria se uma matriz continha um valor.

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

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

No Swift 3 , as amostras devem ser escritas da seguinte maneira:

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
}
Mick MacCallum
fonte
1
E se você tiver flags |= .Alert? Você pode usar flags = [flags, .Alert]?
precisa saber é o seguinte
isto é tratado como um conjunto em que os valores são únicos ou como uma matriz que pode levar a um valor final incorreto?
user3246173
@ user3246173 Depende de como a variável flags é declarada. Se o tipo de bandeira é explicitamente declarado como UIUserNotificationType, isto é var flags: UIUserNotificationType = [.Alert, .Badge], em seguida, ele será tratado como um conjunto, e você poderia adicionar um elemento ou usando conjunto de métodos de instância como insert(), union(), unionInPlace()ou com a abordagem que você mencionou sem se preocupar com duplicatas.
Mick MacCallum
Se você não declarar explicitamente sinalizadores como tendo o tipo UIUserNotificationTypee usar algo como var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]em sua declaração, o tipo do sinalizador será inferido como sendo [UIUserNotificationType], e adicionar elementos a ele por meio de append()outros métodos resultará em duplicatas. No caso deste último, você pode simplesmente inicializar uma instância do UIUserNotificationTypearray como entrada e tudo ficará bem, mas eu recomendo a abordagem baseada em conjunto para maior clareza.
Mick MacCallum
35

Você pode escrever o seguinte:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
fonte
9
Muito complicado.
return true
1
uau, isso parece horrível! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), Mas graças a uma solução de trabalho
Chad Scira
2
Se não estou errado, você pode escrevervar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
BOBJ-C
7

O que funcionou para mim foi

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
fonte
9
parece quase exatamente como a resposta aceita acima. Considere como um comentário?
Max MacLeod
2

Isso foi atualizado no Swift 3.

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