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), категории: ноль)).
некак Kinich
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]?
user3246173
т.е. рассматривается ли это как набор, в котором значения являются уникальными, или как массив, который может привести к неверному конечному значению?
user3246173
@ user3246173 Это зависит от того, как объявлена ​​переменная flags. Если тип флага явно объявлен 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)
BOBJ-С
источник
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)
CodeSteger
источник