Swift 2.0-二項演算子「|」2つの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)、categories:nil))
Nekak Kinich

1
今私は持っています:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov

申し訳ありませんが、別のアイデアはありません。
Nekak Kinich

回答:


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
}

スウィフト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 2016年

すなわち、これは値が一意であるセットのように扱われますか、それとも不正な最終値につながる可能性のある配列として扱われますか?
user3246173

@ user3246173フラグ変数の宣言方法によって異なります。フラグの種類が明示的として宣言されている場合UIUserNotificationType、すなわちvar flags: UIUserNotificationType = [.Alert, .Badge]、それはセットのように扱われ、あなたがインスタンスメソッドが好きなセットを使用することにより、いずれかの要素を追加することができinsert()union()unionInPlace()、またはあなたが重複を気にせずに言及したことにアプローチしています。
Mick MacCallum、2016年

フラグが型を持つUIUserNotificationTypeものとして明示的に宣言せずvar flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]、宣言のようなものを使用する場合、フラグの型はであると推定され[UIUserNotificationType]、要素append()または他のメソッドを介してそれにフラグを追加すると、重複が発生します。後者の場合は、UIUserNotificationType配列を入力として使用してのインスタンスを初期化するだけで十分ですが、わかりやすくするために、セットベースのアプローチをお勧めします。
Mick MacCallum、2016年

35

次のように書くことができます:

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

9
複雑すぎる。
trueを返す

1
これは恐ろしく見えます! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways)、しかし実用的な解決策に感謝
Chad 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
上記の受け入れられた答えとほぼ同じに見えます。コメントとして検討しますか?
Max MacLeod

2

これはSwift 3で更新されました。

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.