2015-06-10 21 views
181

Tôi cố gắng để đăng ký ứng dụng của tôi cho các thông báo địa phương theo cách này:Swift 2.0 - Trình điều khiển nhị phân "|" không thể được áp dụng cho hai toán hạng UIUserNotificationType

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

Trong Xcode 7 và Swift 2.0 - Tôi nhận được lỗi Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Làm ơn giúp tôi.

+2

bao quanh với "()" làm việc cho tôi UIApplication.sharedApplication() registerUserNotificationSettings (UIUserNotificationSettings (forTypes:. (UIUserNotificationType .Alert | UIUserNotificationType.Badge), loại: nil)) –

+1

Bây giờ tôi có: 'Không thể tìm thấy tình trạng quá tải '|' chấp nhận các đối số được cung cấp' –

+0

Tôi không có ý tưởng nào khác, xin lỗi. –

Trả lời

386

Trong Swift 2, nhiều loại mà bạn thường làm điều này đã được cập nhật để phù hợp với giao thức OptionSetType. Điều này cho phép mảng giống như cú pháp sử dụng, và trong trường hợp của bạn, bạn có thể sử dụng như sau.

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

Và trên ghi chú liên quan, nếu bạn muốn kiểm tra tùy chọn có chứa tùy chọn cụ thể, bạn không còn cần phải sử dụng bit AND và kiểm tra không. Bạn có thể chỉ cần đặt tùy chọn nếu nó chứa một giá trị cụ thể giống như cách bạn sẽ kiểm tra xem một mảng có chứa một giá trị hay không.

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

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

Trong Swift 3, các mẫu phải được viết như sau:

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

Còn nếu bạn có '' 'flags | = .Alert?' '' Bạn có thể sử dụng '' 'flags = [flags, .Alert]' ''? – user3246173

+0

Nghĩa là điều này được coi là một Tập hợp trong đó các giá trị là duy nhất hoặc là một Mảng có thể dẫn đến giá trị cuối cùng không chính xác? – user3246173

+0

@ user3246173 Nó phụ thuộc vào cách biến cờ được khai báo. Nếu kiểu cờ được khai báo rõ ràng là 'UIUserNotificationType', nghĩa là' var flags: UIUserNotificationType = [.Alert, .Badge] ', thì nó sẽ được coi như một tập hợp và bạn có thể thêm một phần tử bằng cách sử dụng các phương thức instance set như' insert() ',' union() ',' unionInPlace() ', hoặc với cách tiếp cận mà bạn đã đề cập mà không phải lo lắng về các bản sao. –

35

Bạn có thể viết như sau:

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

Cách quá phức tạp. –

+0

bạn đúng :) –

+1

wow điều này trông ghê gớm! 'NSTrackingAreaOptions.MouseEnteredAndExited.union (NSTrackingAreaOptions.MouseMoved) .union (NSTrackingAreaOptions.ActiveAlways)', nhưng nhờ giải pháp làm việc –

7

gì làm việc cho tôi là

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

trông gần như chính xác như câu trả lời được chấp nhận ở trên. Hãy xem như một bình luận? –

+0

Điều này cũng phù hợp với tôi –

2

này đã được cập nhật trong Swift 3.

 let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
     UIApplication.shared.registerUserNotificationSettings(settings) 
Các vấn đề liên quan