Swift 2.0 - ตัวดำเนินการไบนารี“ |” ไม่สามารถใช้กับตัวถูกดำเนินการ UIUserNotificationType สองตัว


193

ฉันกำลังพยายามลงทะเบียนแอปพลิเคชันของฉันสำหรับการแจ้งเตือนในท้องถิ่นด้วยวิธีนี้:

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

ใน Xcode 7 และสวิฟท์ 2.0 - Binary Operator "|" cannot be applied to two UIUserNotificationType operandsฉันได้รับข้อผิดพลาด โปรดช่วยฉันด้วย


2
ล้อมรอบด้วย "()" การทำงานสำหรับฉัน UIApplication.sharedApplication () registerUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge) ประเภท: ไม่มี)).
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)

และในบันทึกที่เกี่ยวข้องหากคุณต้องการตรวจสอบว่าชุดตัวเลือกมีตัวเลือกเฉพาะคุณไม่จำเป็นต้องใช้บิตและและไม่มีการตรวจสอบอีกต่อไป คุณสามารถถามตัวเลือกการตั้งค่าถ้ามันมีค่าเฉพาะในลักษณะเดียวกับที่คุณจะตรวจสอบว่าอาร์เรย์มีค่า

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 มันขึ้นอยู่กับวิธีการประกาศตัวแปรธง ถ้าชนิดธงมีการประกาศอย่างชัดเจนว่าUIUserNotificationTypeคือvar flags: UIUserNotificationType = [.Alert, .Badge]แล้วมันจะได้รับการปฏิบัติเหมือนชุดและคุณสามารถเพิ่มองค์ประกอบใดโดยการใช้วิธีการเช่นชุดเช่นinsert(), union(), unionInPlace()หรือด้วยวิธีการที่คุณกล่าวถึงโดยไม่ต้องกังวลเกี่ยวกับรายการที่ซ้ำกัน
มิก MacCallum

หากคุณไม่ได้ประกาศค่าสถานะอย่างชัดเจนว่ามีประเภทUIUserNotificationTypeและใช้สิ่งที่ต้องการvar flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]ในการประกาศของคุณประเภทของค่าสถานะจะถูกอนุมานว่าเป็น[UIUserNotificationType]และการเพิ่มองค์ประกอบให้กับมันผ่านทางappend()หรือวิธีการอื่น ๆ จะทำให้ซ้ำกัน ในกรณีหลังคุณสามารถเริ่มต้นอินสแตนซ์ของUIUserNotificationTypeกับอาร์เรย์เป็นอินพุทและทั้งหมดจะดี แต่ฉันแนะนำวิธีการตั้งค่าตามเพื่อความชัดเจน
มิก MacCallum

35

คุณสามารถเขียนสิ่งต่อไปนี้:

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

9
ทางซับซ้อนเกินไป
ส่งคืนจริง

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.