Swift 2.0-이진 연산자“|” 두 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 (전무) UIUserNotificationType.Badge), 범주 (UIUserNotificationType.Alert UIUserNotificationSettings (forTypes)와 주변 지역
Nekak Kinich

1
지금은이 :Could not find an overload '|' that accepts the supplied arguments
니키타 Zernov

다른 생각이 없습니다. 죄송합니다.
Nekak Kinich 2016 년

답변:


387

Swift 2에서는 일반적으로이 작업을 수행하는 많은 유형이 OptionSetType 프로토콜을 준수하도록 업데이트되었습니다. 이를 통해 사용법에 대한 구문과 같은 배열을 사용할 수 있으며 귀하의 경우 다음을 사용할 수 있습니다.

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

그리고 관련 메모에서 옵션 세트에 특정 옵션이 포함되어 있는지 확인하려면 더 이상 비트 AND 및 무 검사를 사용할 필요가 없습니다. 배열에 값이 포함되어 있는지 확인하는 것과 같은 방식으로 옵션 값에 특정 값이 포함되어 있는지 간단히 물어볼 수 있습니다.

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

즉, 값이 고유 한 배열 또는 잘못된 최종 값을 초래할 수있는 배열로 취급됩니까?
user3246173

@ user3246173 그것은 flags 변수가 어떻게 선언되는지에 달려 있습니다. 플래그의 종류가 명시 적으로 선언 된 경우 UIUserNotificationType, 즉 var flags: UIUserNotificationType = [.Alert, .Badge], 다음은 세트처럼 취급 될 것입니다, 당신은 인스턴스 메소드가 같은 집합을 사용하여 두 요소를 추가 할 수 있습니다 insert(), union(), unionInPlace(), 또는 중복에 대한 걱정없이 언급하는 접근 방식.
Mick MacCallum

명시 적으로 유형을 가진 것으로 플래그를 선언하지 않고 선언 에서 UIUserNotificationType와 같은 것을 사용 var flags = [UIUserNotificationType.Alert, UIUserNotificationType.Badge]하면 플래그 유형이로 추론되며 [UIUserNotificationType]요소를 append()다른 메소드 를 통해 추가하면 중복이 발생합니다. 후자의 경우 UIUserNotificationType배열을 입력 으로 사용하여 인스턴스를 간단히 초기화 할 수 있으며 모든 것이 잘 될 것이지만 명확성을 위해 세트 기반 접근법을 권장합니다.
Mick MacCallum

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.