Swift 2.0 - Operator binarny „|” nie można zastosować do dwóch argumentów UIUserNotificationType

193

Próbuję zarejestrować moją aplikację do powiadomień lokalnych w ten sposób:

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

W Xcode 7 i Swift 2.0 - pojawia się błąd Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Proszę pomóż mi.

Nikita Zernov
źródło
2
Otacza się "()" działa na mnie UIApplication.sharedApplication () registerUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), Kategorie: nil)).
Nekak Kinich
1
Teraz mam:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov,
Przepraszam, nie mam innego pomysłu.
Nekak Kinich,

Odpowiedzi:

387

W Swift 2 wiele typów, dla których zwykle to robisz, zostało zaktualizowanych, aby były zgodne z protokołem OptionSetType. Pozwala to na użycie tablicy podobnej do składni, aw twoim przypadku możesz użyć następujących.

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

I w powiązanej notatce, jeśli chcesz sprawdzić, czy zestaw opcji zawiera określoną opcję, nie musisz już używać bitowego AND i zerowego sprawdzania. Możesz po prostu zapytać zestaw opcji, czy zawiera on określoną wartość, w taki sam sposób, jak sprawdziłbyś, czy tablica zawiera wartość.

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

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

W Swift 3 próbki należy zapisać w następujący sposób:

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

i

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

if settings.types.contains(.alert) {
    // stuff
}
Mick MacCallum
źródło
1
Co jeśli masz? flags |= .Alert? Czy możesz użyć flags = [flags, .Alert]?
user3246173,
tzn. Czy jest to traktowane jak zbiór, w którym wartości są unikalne, czy jako tablica, która może prowadzić do niepoprawnej wartości końcowej?
user3246173,
@ user3246173 Zależy to od sposobu deklarowania zmiennej flagi. Jeśli typ bandery jest jawnie zadeklarowane jako UIUserNotificationType, to znaczy var flags: UIUserNotificationType = [.Alert, .Badge], to będzie traktowany jak zestaw, i można dodać element albo za pomocą zestawu metod instancji podoba insert(), union(), unionInPlace(), lub z podejściem, że pan wspomniał, nie martwiąc się o duplikaty.
Mick MacCallum
Jeśli nie zadeklarujesz jawnie flag jako mających typ UIUserNotificationTypei nie użyjesz czegoś takiego jak var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]w deklaracji, wtedy typ flagi będzie wywnioskowany jako [UIUserNotificationType], a dodanie do niej elementów za pomocą append()lub innymi metodami spowoduje duplikaty. W przypadku tego ostatniego możesz po prostu zainicjować instancję UIUserNotificationTypez tablicą jako danymi wejściowymi i wszystko będzie dobrze, ale dla jasności zalecam podejście oparte na zestawie.
Mick MacCallum
35

Możesz napisać następujące:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
źródło
9
Zbyt skomplikowane.
zwróć wartość rzeczywistą
1
wow, to wygląda okropnie! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), ale dzięki za działające rozwiązanie
Chad Scira,
2
Jeśli się nie mylę, możesz napisaćvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C,
7

Dla mnie zadziałało

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
źródło
9
wygląda prawie dokładnie tak, jak zaakceptowana powyżej odpowiedź. Uważasz za komentarz?
Max MacLeod,
2

Zostało to zaktualizowane w Swift 3.

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
CodeSteger
źródło