2014-07-22 2 views
2

NSNotification을 통해받은 값과 열거 형 값을 비교하는 간단한 작업을 수행하려고합니다. 나는 작동하는 무언가가 있지만, 이것이 이것이 올바른 방법이라고 믿을 수는 없습니다. 기본적으로 해결책은 NSNumber를 Int로 변환하고 NSNumber에서 값을 래핑 한 다음 해당 integerValue를 가져 오는 enum 값의 rawValue를 얻는 것입니다.NSNumber를 신속한 열거 형 값과 어떻게 비교합니까?

내가 시도한 다른 모든 것은 Uint 8과 Int 또는 이와 유사한 것으로 변환 할 수 없다는 컴파일러 오류가 발생했습니다.

observer = NSNotificationCenter.defaultCenter().addObserverForName(AVAudioSessionRouteChangeNotification, object: nil, queue: mainQueue) { notification in 

     println(AVAudioSessionRouteChangeReason.NewDeviceAvailable.toRaw()) 

     if let reason = notification.userInfo[AVAudioSessionRouteChangeReasonKey!] as? NSNumber { 
      if (reason.integerValue == NSNumber(unsignedLong:AVAudioSessionRouteChangeReason.NewDeviceAvailable.toRaw()).integerValue) { 
       self.headphoneJackedIn = true; 
      } else if (reason.integerValue == NSNumber(unsignedLong:AVAudioSessionRouteChangeReason.OldDeviceUnavailable.toRaw()).integerValue) { 
       self.headphoneJackedIn = false; 
      } 
      self.updateHeadphoneJackLabel() 
     } 
    } 
+0

'fromRaw'를 대신 사용하는 것은 어떻습니까? – ColinE

답변

8

이 작동합니다 :

if reason.integerValue == Int(AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue) { 
    // ... 
} 

비고 :AVAudioSessionRouteChangeReason 열거 원시 값 유형으로 UInt을 사용하기 때문에 일이 명시 적 변환없이 작동하는 것을 기대할 수 :

if reason.unsignedIntegerValue == AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue { 

} 

그러나 Xcode 6 베타 4부터 NSUInteger은 Swift ' OS X 및 OS X의 Int 시스템 프레임 워크로, integerValueunsignedIntegerValue은 모두 Int, 을 반환하며 명시 적 변환이 필요하다는 것을 의미합니다. 또한

(이미 댓글에 @ColinE 에 의해 제안), 당신은 수에서 열거 값을 만들 수 있습니다 다음 스위치 케이스 사용, 명시 적 UInt 위와 같은 이유로

if let r = AVAudioSessionRouteChangeReason(rawValue: UInt(reason.integerValue)) { 
    switch r { 
    case .NewDeviceAvailable: 
     // ... 
    case .OldDeviceUnavailable: 
     // ... 
    default: 
     // ... 
    } 
} else { 
    println ("Other reason") 
} 

을 여기에서도 변환이 필요합니다.

+0

이것은 의미가 있습니다, 나는 그것을 시도 할 것입니다. 내가 놓친 부분은 Int에서 UInt로 변환하는 방법이라고 생각합니다. 나는 Uint와 같은 일을하려고 노력하고 있었고 아무것도 작동하지 않았습니다. –

+0

Xcode 6.1부터는'Enum.fromRaw (value)'대신'Enum (rawValue : value)'를 사용해야합니다. 여기를 참고하십시오 : [원시 값에서 초기화] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-XID_226)) – Cornelius

+0

@Cornelius : 당신은 완전합니다. 의견을 보내 주셔서 감사합니다. –