Swift 2.0 - Operator Biner “|” tidak dapat diterapkan ke dua operan UIUserNotificationType

193

Saya mencoba mendaftarkan aplikasi saya untuk notifikasi lokal dengan cara ini:

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

Di Xcode 7 dan Swift 2.0 - Saya mendapatkan kesalahan Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Tolong bantu aku.

Nikita Zernov
sumber
2
Dikelilingi dengan "()" berfungsi untuk saya UIApplication. SharedApplication (). RegisterUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.lert | UIUserNotificationType.Badge), kategori: nil))
Nekak Kinich
1
Sekarang saya punya:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov
Saya tidak punya ide lain, maaf.
Nekak Kinich

Jawaban:

387

Di Swift 2, banyak jenis yang biasanya Anda lakukan untuk ini telah diperbarui agar sesuai dengan protokol OptionSetType. Ini memungkinkan untuk array seperti sintaks untuk penggunaan, dan Dalam kasus Anda, Anda dapat menggunakan yang berikut ini.

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

Dan pada catatan terkait, jika Anda ingin memeriksa apakah set opsi berisi opsi tertentu, Anda tidak perlu lagi menggunakan bitwise AND dan nil check. Anda cukup meminta opsi yang disetel apakah itu berisi nilai tertentu dengan cara yang sama seperti Anda akan memeriksa apakah array berisi nilai.

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

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

Dalam Swift 3 , sampel harus ditulis sebagai berikut:

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

dan

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

if settings.types.contains(.alert) {
    // stuff
}
Mick MacCallum
sumber
1
Bagaimana jika Anda flags |= .Alert? dapat, Bisakah Anda menggunakan flags = [flags, .Alert]?
user3246173
yaitu apakah ini diperlakukan seperti Set di mana nilai unik atau sebagai Array yang mungkin mengarah ke nilai akhir yang salah?
user3246173
@ user3246173 Tergantung pada bagaimana variabel flag dideklarasikan. Jika jenis bendera ini secara eksplisit dinyatakan sebagai UIUserNotificationType, yaitu var flags: UIUserNotificationType = [.Alert, .Badge], maka akan diperlakukan seperti satu set, dan Anda bisa menambahkan elemen baik dengan menggunakan set metode instan seperti insert(), union(), unionInPlace(), atau dengan pendekatan yang Anda sebutkan tanpa khawatir tentang duplikat.
Mick MacCallum
Jika Anda tidak secara eksplisit mendeklarasikan flag sebagai memiliki tipe UIUserNotificationTypedan menggunakan sesuatu seperti var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]dalam deklarasi Anda, maka tipe flag akan disimpulkan [UIUserNotificationType], dan menambahkan elemen ke dalamnya melalui append()atau metode lain akan menghasilkan duplikat. Dalam kasus yang terakhir, Anda cukup menginisialisasi instance UIUserNotificationTypedengan array sebagai input dan semuanya akan baik-baik saja, tetapi saya merekomendasikan pendekatan berbasis set untuk kejelasan.
Mick MacCallum
35

Anda dapat menulis yang berikut ini:

let settings = UIUserNotificationType.Alert.union(UIUserNotificationType.Badge)
Bobj-C
sumber
9
Terlalu rumit.
mengembalikan true
1
wow ini terlihat mengerikan! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), tapi terima kasih atas solusi yang berhasil
Chad Scira
2
Jika saya tidak salah, Anda dapat menulisvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C
7

Apa yang berhasil untuk saya adalah

//This worked
var settings = UIUserNotificationSettings(forTypes: UIUserNotificationType([.Alert, .Badge, .Sound]), categories: nil)
Ah Ryun Moon
sumber
9
terlihat hampir persis seperti jawaban yang diterima di atas. Pertimbangkan sebagai komentar?
Max MacLeod
2

Ini telah diperbarui di Swift 3.

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