2014-12-15 2 views
0

의 신속한 사전 변이 방법 : 마지막 줄은 컴파일 오류가 발생나는 사전을 포함하는 스위프트 사전을 가지고, 내가 키 - 값에 액세스하는 저장 속성을 사용하고 싶었 사전

var json = [NSObject:AnyObject]() 
    var title: String { 
    get { 
     return (self.json["category"]! as [NSObject: AnyObject])["title"] as String 
    } 
    set { 
//  var dict = (self.json["category"]! as [NSObject: AnyObject]) 
//  dict["title"] = newValue 

     (self.json["category"]! as [NSObject: AnyObject])["title"] = newValue 
    } 
    } 

을 :의 피연산자 후위 '!' 선택적 유형을 가져야합니다. 타입은 '(NSObject, AnyObject)'입니다.

명백히 컴파일 오류를 기반으로 컴파일러는 self.json [ "category"]가 사전으로 변환 할 수없는 유형 (NSObject, AnyObject)이라고 생각합니다!

나는 이것이 일반적인 사용법이어야한다고 생각 했는가? 어떻게 사전을 사전에 액세스 하시겠습니까?

답변

0

이것은 튜플입니다. 우리에게 필요한 것은 사전입니다.

set { 
      //  var dict = (self.json["category"]! as [NSObject: AnyObject]) 
      //  dict["title"] = newValue 
      //  self.json["category"] = dict 
      var category: [NSObject: AnyObject] = self.json["category"] as [NSObject: AnyObject] 
      category["title"] = newValue 
    } 
+0

예, 컴파일러에서 튜플이라고 말하면서 왜이 두 줄을 한 줄로 조합 할 수 없는지 이해할 수 없습니다. – Sean

1

나는 아직도 여기에 작용하는 메커니즘을 이해하지 고백,하지만 난 패턴을 참조하십시오 스위프트는 객체의 가변 유형 AnyObject에서 다운 캐스트 좋아하지 않는다. 불변 타입으로의 다운 캐스팅을 용서하는 것이 더 낫습니다. 위의 비대칭 성을 알아 차리는 이유입니다. 귀하의 getter는 괜찮지 만 setter는 그렇지 않습니다.

class UsingNSMutableDictionary { 
    var json = NSMutableDictionary() 
    var title: String { 
     get { 
      return self.json["category"]!["title"] as String 
     } 
     set { 
      (self.json["category"] as NSMutableDictionary)["title"] = newValue 
     } 
    } 
} 

딜링 :

나는 당신의 모든 제약 조건이 무엇인지 모르겠지만, 겉으로는 더 신뢰할 수있는 방법은 당신이 시도하고 무엇을 할 당신의 마음의 콘텐츠를 downcasting 허용하는 NSMutableDictionary을 사용하는 것입니다 Swift의 JSON은 많은 토론과 몇 개 이상의 라이브러리를 창안했습니다. JSON을 사용하여 작업하는 방법에 대한 실용적인 솔루션을 찾고 있다면이 라이브러리 중 하나를 사용해 보시기 바랍니다. JSON 처리에 내재 된 동적 유형을 사용하여 Swift에서보다 강력한 접근 방식을 취하는 경향이 있습니다.

+0

네이티브 swift dictionary는 값 유형이고 nsdictionary는 참조 유형입니다. 그것이 내가 사용할 것을 선택하는 방법입니다. 말하자면, 나는 당신에게 동의한다. 나는 네이티브의 신속한 수금 유형에 더 많은 어려움이있는 것처럼 보인다. btw, UsingSwiftNative setter가 작동하지 않는다고 생각합니다. – Sean

+0

네가 맞아! 미안합니다. 나는 그것을 불필요하게 보이는 것에 따라 그것을 끌어 올릴 것이다. –

관련 문제