2014-10-22 3 views
6

원격 알림 userInfo 사전에서 배지 값을 추출하려고합니다. 많은 게시물을 읽고 내 문제의 해결책을 찾았지만 만족스럽지 않습니다! 나는 다음을 수행하고자하는 { aps = { badge = 7 } }Swift : '(NSObject, AnyObject)'에 'subscript'라는 멤버가 없습니다.

이 번호를 추출하려면 '7'내 userInfo에서 : 그래서 여기

내 데이터 구조 (나는 쓸모없는 선을 제거)입니다

self.updateAppIcon(userInfo["aps"]["badge"] as? Int) 

그러나

스위프트 : 물론 나는 다음과 같은 오류가

'(NSObject의, AnyObject가)'회원이 이름이 없습니다 '첨자'

내가 잘못하지 않았다면 []은 다른 사전으로 해석 할 수없는 AnyObject를 반환하기 때문입니다. 더 섹시한 방법으로

func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 

    if let aps: AnyObject = userInfo["aps"] { 
     if let apsDict = aps as? [String : AnyObject]{ 
      if let badge: AnyObject = apsDict["badge"] { 
       self.updateAppIconBadgeNumber(badge as? Int) 
      } 
     } 
    } 
} 

func updateAppIconBadgeNumber(number: Int?) { 
    // do stuff here 
} 

하지만 심각 ... 내가 할 수있는 : 다음을 수행하는 것입니다

작업 솔루션? 적은 줄, 적은 절, 적은 캐스트 등? 이것은 쉬운 일의 "코드 - 복합"솔루션입니다.

감사

답변

9

최단 하나는 : "Optional Chaining"이라고

// Xcode 6.0.1 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = [userInfo["aps"]?["badge"]][0] as? Int { 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

// Xcode 6.1 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = userInfo["aps"]?["badge"] as? Int { 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

?["aps"] 사이 ["badge"]. userInfo["aps"]nil을 반환 할 수 있기 때문에 필요합니다. 그리고 [String : AnyObject]으로 전송할 필요가 없습니다. AnyObject에 'subscript'멤버가 있기 때문입니다. 우리는 엑스 코드 6.0.1에 [ ... ][0] 필요한 이유

그리고는 ... 나도 몰라한다 :(.A 버그, 아마. 당신의 답변

+1

정말 고마워!이 "선택적인 연결"에 대한 단서가 없었습니다. 솔루션과 링크 모두에 감사드립니다! –

3

당신은 coleascing 운영자 전무 사용하고 짧은 만들하지만 당신은 가독성을 풀 수 있었다. 이 같은 방법의 한 줄 버전,

func handleRemoteNotification(userInfo: [NSObject : AnyObject]) { 
    if let badge = ((userInfo["aps"] as? [String: AnyObject]) ?? ([String: AnyObject]()))["badge"] as? Int{ 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

이있는 경우 typealias [문자열 : AnyObject] 수와는 조금 더 읽을 보이게.

typealias Dict = [String: AnyObject] 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = ((userInfo["aps"] as? Dict) ?? Dict())["badge"] as? Int{ 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 
+0

감사합니다,이 사실뿐만 아니라 완벽하게 작동하지만 같이있다 @printaro가 준 응답은 나에게 더 좋을 것 같지만, 나에게 설명 할 수 있거나이 'nil coleascing operator'에 대한 링크를 공유 할 수 있습니까? '에 대한 단서가 없습니다. –

+0

' nil coalescing operator : ?? '는 애플의 아이북 (iBook)에서 자세히 설명하고있다. 나는 SO 주석에서 인용 부호를 인용 할 수는 없지만, 책의 내용을 직접적으로 볼 수있다 : nil coalescing operator'(?? b) a가 값을 포함하고있는 경우 옵션 a를 언랩하거나, a가 nil 일 경우 기본값 b를 반환합니다. 식 a는 항상 선택적 형식입니다. 식 b는 s 내부를 돌렸다. nil 병합 연산자는 아래 코드의 약어입니다. 'a! = nil? 에이! : b' – ArtSabintsev