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), категории: ноль))
  • 1
    Теперь у меня есть: Could not find an overload '|' that accepts the supplied arguments
Показать ещё 1 комментарий
Теги:
swift2

4 ответа

367
Лучший ответ

В 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] ?
  • 0
    т.е. рассматривается ли это как набор, в котором значения являются уникальными, или как массив, который может привести к неверному конечному значению?
Показать ещё 2 комментария
34

Вы можете написать следующее:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
  • 9
    Слишком сложно.
  • 0
    вы правы :)
Показать ещё 2 комментария
7

Что сработало для меня, было

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
  • 9
    выглядит почти так же, как принятый ответ выше. Рассматривать как комментарий?
  • 0
    Это сработало и для меня
2

Это обновлено в Swift 3.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню