Swift 2.0 - Toán tử nhị phân | | không thể được áp dụng cho hai toán hạng UIUserNotificationType


193

Tôi đang cố gắng đăng ký ứng dụng của mình cho các thông báo địa phương theo cách này:

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

Trong Xcode 7 và Swift 2.0 - tôi gặp lỗi Binary Operator "|" cannot be applied to two UIUserNotificationType operands. Làm ơn giúp tôi.


2
Bao quanh với "()" công trình đối với tôi UIApplication.sharedApplication () registerUserNotificationSettings (UIUserNotificationSettings (forTypes: (UIUserNotificationType.Alert | UIUserNotificationType.Badge), danh mục: nil)).
Nekak Kinich

1
Bây giờ tôi có:Could not find an overload '|' that accepts the supplied arguments
Nikita Zernov

Tôi không có ý tưởng khác, xin lỗi.
Nekak Kinich

Câu trả lời:


387

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 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 một lưu ý liên quan, nếu bạn muốn kiểm tra xem một bộ tùy chọn có chứa một tùy chọn cụ thể hay không, bạn không còn cần phải sử dụng bitwise AND và kiểm tra không. Bạn có thể chỉ cần hỏi tùy chọn được đặt nếu nó chứa một giá trị cụ thể theo cùng cách mà bạn sẽ kiểm tra xem một mảng có chứa 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]thì sao?
dùng3246173

tức là điều này được xử lý như 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 một giá trị cuối cùng không chính xác?
dùng3246173

@ user3246173 Nó phụ thuộc vào cách khai báo biến cờ. Nếu loại cờ được khai báo rõ ràng như UIUserNotificationType, ví dụ var flags: UIUserNotificationType = [.Alert, .Badge], sau đó nó sẽ được coi như một bộ, và bạn có thể thêm một yếu tố hoặc bằng cách sử dụng thiết lập các phương pháp dụ như insert(), union(), unionInPlace(), hoặc với phương pháp mà bạn đề cập đến mà không lo lắng về bản sao.
Mick MacCallum

Nếu bạn không khai báo rõ ràng các cờ là có loại UIUserNotificationTypevà sử dụng một cái gì đó giống như var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]trong khai báo của bạn, thì loại cờ sẽ được suy ra [UIUserNotificationType]và thêm các phần tử vào đó thông qua append()hoặc các phương thức khác sẽ dẫn đến trùng lặp. Trong trường hợp sau, bạn có thể chỉ cần khởi tạo một thể hiện UIUserNotificationTypevới mảng là đầu vào và tất cả sẽ ổn, nhưng tôi khuyên bạn nên sử dụng cách tiếp cận dựa trên tập hợp cho rõ ràng.
Mick MacCallum

35

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

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

9
Cách quá phức tạp.
trả lại đúng

1
wow điều này có vẻ gớm ghiếc! NSTrackingAreaOptions.MouseEnteredAndExited.union(NSTrackingAreaOptions.MouseMoved).union(NSTrackingAreaOptions.ActiveAlways), nhưng cảm ơn vì một giải pháp hiệu quả
Chad Scira

2
Nếu tôi không sai, bạn có thể viếtvar options : NSTrackingAreaOptions =[.MouseEnteredAndExited,.MouseMo‌​ved,.ActiveAlways]
Bobj-C

7

Những 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. Coi như một bình luận?
Max MacLeod

2

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

        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.