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),类别:无))
Nekak Kinich 2015年

1
现在我有:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov

我没有别的主意,对不起。
Nekak Kinich 2015年

Answers:


387

在Swift 2中,通常要执行此操作的许多类型已更新为符合OptionSetType协议。这允许使用类似数组的语法,并且在您的情况下,可以使用以下语法。

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

与此相关的是,如果要检查选项集是否包含特定选项,则不再需要使用按位AND和nil检查。您可以简单地询问选项集是否包含特定值,就像检查数组是否包含值一样。

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

即,是否将其视为值唯一的Set或可能会导致错误的最终值的Array?
user3246173 '16

@ user3246173这取决于如何声明flags变量。如果标志的类型是明确声明UIUserNotificationType,即var flags: UIUserNotificationType = [.Alert, .Badge],那么它会被当作一个集合,您可以通过使用组实例方法或者像添加元素insert()union()unionInPlace(),或与您无需担心重复提到的方法。
米克·麦卡勒姆

如果没有显式声明标志具有类型,UIUserNotificationTypevar 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),但感谢您提供有效的解决方案
Chad Scira 2015年

2
如果我没记错,您可以写var options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C 2015年

7

对我有用的是

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

9
看起来几乎完全像上面接受的答案。考虑作为评论?
Max MacLeod

2

在Swift 3中已更新。

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.