2017-01-04 1 views
0

중첩 된 사전에서 int를 잡으려고합니다. 그러나내 사전 항목이 계속 0을 반환하는 이유는 무엇입니까? Swift

convenience init(fromDict dict: [String:Any]) { 
    let dfs = dict["forms"] as? [[String :[String:Any]]] 
    self.init(
     atk: dfs?[0]["stats"]?["atk"] as? Int ?? 0, 
     def: dfs?[0]["stats"]?["def"] as? Int ?? 0, 
    ) 
} 

를 다음과 같이 내 코드는 결과가 나는 이것이 올바른 파일 경로 것이 확실한 경우 0을 높이 유지, 그래서 왜 올바른 정수를 표시하지 않습니다? 아래는 내가 움켜 잡고있는 plist 길입니다. 이 문제에 대한 도움은 크게 감사하겠습니다.

<array> 
    <dict> 
    <key>forms</key> 
    <array> 
     <dict> 
      <key>stats</key> 
      <dict> 
       <key>atk</key> 
       <integer>49</integer> 
       <key>def</key> 
       <integer>49</integer> 
      </dict> 
     </dict> 
    </array> 
    </dict> 
<array/> 
+1

디버거를 사용하고'dfs'와'dfs [0]'과'dfs [0] [ "stats "]'등 – rmaddy

+0

init에'print (dict)'를 추가 할 수도 있습니다. '[ "forms": [[ "stats": [ "def": 49, "atk": 49]]]]'를 출력해야합니다. – vacawama

+0

"형태"<__ NSCFArray 0x170266400> ( { 통계 = { 공격력 = 49 데프 = 49 }; – user4938361

답변

1

이와 같이 선택적 연결을 남용해서는 안됩니다. 당신은 기본적으로 이런 오류를 간청합니다. 당신이 (Array<Dictionary<String, <Dictionary<String, Any>>> a.k.a) [[String :[String:Any]]]에 캐스팅하려고 노력하고 있기 때문에

dfsnil이지만, 실제 타입 (일명, Dictionary<String, <Dictionary<String, Any>>) [String :[String:Any]]입니다.

올바른 처리 옵션을 선택했다면 즉시이 오류를 발견했을 것입니다.

convenience init(fromDict dict: [String:Any]) { 
    guard let let dfs = dict["forms"] as? [String :[String:Any]] else { 
     fatalError("Failed trying to cast dfs") 
    } 

    guard let stats = dfs["stats"] else { 
     fatalError("No value for \"stats\" key.") 
    } 

    guard let atk = stats["atk"] as? Int else { 
     fatalError("Missing or invalid value for \"atk\" key") 
    } 

    guard let def = stats["def"] as? Int else { 
     fatalError("Missing or invalid value for \"def\" key") 
    } 

    self.init(
     atk: atk, 
     def: def, 
    ) 
} 
+0

죄송합니다. 게시물을 업데이트했습니다. [[String : [String : Any]]]'사전의 배열이기 때문에 실제로 올바르지 않습니다. 또한 첫 번째 치명적인 오류가 발생했습니다 ** 실패했습니다. dfs를 던지려고 **.하지만 plist를보고 왜 실패할지 이해하지 못합니다. – user4938361

+0

그런 경우에, C를 사용할 때 내가 제공 한 것과 같은 캐스트를'[[String : [String : Any]]]'로 다시 변경 했습니까? – Alexander

+0

예, 올바른 것을 반영하도록 업데이트했습니다. 오류는 여전히 첫 번째 가드에서 계속됩니다. – user4938361

0

그래서 내 질문에 문제점을 발견했습니다. 동시에 여러 소스 파일을 읽었으며 그 중 하나에 "stats" 사전이 없었습니다.

문을 작성하여 "stats"을 확인하거나 불량 원본 파일에서 필요한 내용을 복사하고 모두 삭제하십시오. 나는 그 소스 파일이 나에게 과거에 문제를 일으키는 것으로 알려 졌기 때문에 후자와 같이 갔다.

관련 문제