Swift 2.0 - Бінарний оператор “|” не можна застосувати до двох операндів UIUserNotificationType


193

Я намагаюся зареєструвати свою заявку на місцеві сповіщення таким чином:

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

У Xcode 7 та Swift 2.0 - я отримую помилку Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Будь ласка, допоможи мені.


2
Оточує "()" працює для мене UIApplication.sharedApplication (). RegisterUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), категорії: nil))
Нек Кініч,

1
Зараз у мене є:Could not find an overload '|' that accepts the supplied arguments
Микита Зернов

У мене немає іншої ідеї, вибачте.
Некак Кініч

Відповіді:


387

У Swift 2 багато типів, для яких ти зазвичай робиш це, були оновлені, щоб відповідати протоколу OptionSetType. Це дозволяє використовувати синтаксис масиву для використання, і у вашому випадку ви можете використовувати наступне.

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

І у відповідній примітці, якщо ви хочете перевірити, чи містить набір опцій певний параметр, вам більше не потрібно використовувати побітові І і нульові чеки. Ви можете просто запитати набір параметрів, чи містить він певне значення так само, як і ви перевіряли, чи містить масив значення.

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

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

У Swift 3 зразки повинні бути записані так:

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

і

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

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

1
А як бути, якщо є? flags |= .Alert? Чи можете ви використовувати flags = [flags, .Alert]?
користувач3246173

тобто це трактується як набір, де значення унікальні або як масив, який, можливо, може призвести до неправильного кінцевого значення?
користувач3246173

@ user3246173 Це залежить від того, як оголошено змінну прапорів. Якщо тип прапора явно оголошений UIUserNotificationType, тобто var flags: UIUserNotificationType = [.Alert, .Badge], то він буде розглядатися як набір, і ви могли б додати елемент , або за допомогою набору методів екземпляра подобається insert(), union(), unionInPlace()або з підходом , який ви згадали , не піклуючись про дублікатах.
Мік Маккаллум

Якщо ви не явно заявляєте, що прапори мають такий тип UIUserNotificationTypeі використовуєте щось на зразок var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]у своїй декларації, тоді тип прапора буде зроблений як такий [UIUserNotificationType], а додавання до нього елементів за допомогою append()інших методів призведе до дублікатів. У випадку останнього, ви можете просто ініціалізувати екземпляр UIUserNotificationTypeз масивом як вхідний, і все буде добре, але я рекомендую для чіткості встановити підхід на основі встановлених даних.
Мік Маккаллум

35

Ви можете написати наступне:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)

9
Шлях занадто складний.
повернення справжнього

1
ого, це виглядає огидно! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), але спасибі за робоче рішення
Чад Scira

2
Якщо я не помиляюся, ви можете написатиvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C

7

Що для мене працювало

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)

9
виглядає майже так, як прийнята відповідь вище. Розглянемо як коментар?
Макс Маклеод

2

Це було оновлено у Swift 3.

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.