2017-12-22 5 views
1

나는 스크린 샷에서와 같이 plist을가집니다. 테이블과 셀을 가득 채 웁니다. doesnot 프로토콜을 준수 '유형'(: 모두, 값 모든 키) ' "코드가Plist에 중첩 된 사전 디코딩

을 제공합니다 아래 등등"나는 SecondTable "예를 들어,"FirstTable ","관리자 "안에 모든 사전 싶어 시퀀스 '

오류입니다.

if let path = Bundle.main.path(forResource: "Admin", ofType: "plist") { 
      myDict = NSDictionary(contentsOfFile: path) 
      let admin = myDict?.object(forKey: "Admin") as! NSDictionary 
      for dicts in admin{ 
       for sub_dict in dicts{ 
        print(sub_dict) 
       } 
      } 
} 

Plist Screenshot

+2

왜 사전 만 사용합니까? 'cell-1, -2, -3'과'First-, Second-, ThirdTable' 배열은 사전과 달리 특정 순서를 가지고 있기 때문에 더 적합합니다. 그리고 Swift 4에서는'PropertyListDecoder'를 사용하여 plist를 struct로 직접 디코딩 할 수 있습니다. – vadian

+0

좀 더 자세한 예를 들어 주시겠습니까? FirstTable을 배열로 변경해야합니까? –

답변

2

당신이 배열을 통해 반복과 같이 사전을 통해 같은 방법으로 반복 할 수 없습니다.,당신은 예를 들어, 같은

for dicts in admin { 

사전-항목이 키와 값으로 구성으로

for (key, value) in admin { 

및 단지 하나의 객체를 변경해야합니다 배열.

모든 사전을 반복하려는 경우 재귀가 "필요합니다". 그것이 무엇인지 모르는 경우 기본적으로 자체를 호출하는 메서드입니다 (그러나 무한하지는 않습니다). 이 같은 예를 들어 그렇게 할 수 있습니다 :

func iterateThroughDictionary(dict: Dictionary<String, Any>) { 
    for (key, value) in dict { 
     if let subDict = value as? Dictionary<String, Any> { 
      iterateThroughDictionary(dict: subDict) 
     } else { 
      print(value); 
     } 
    } 
} 

은 그럼 그냥 루트 - 사전에 호출해야합니다.

+0

그걸로 나는 FirstTable, SecondTable 등에 만 접근 할 수 있습니다. 어떻게 세포에서 할 수 있습니까? 셀 1, 셀 2 등 ... –

+0

예를 들어 thirdtable 때문에 내 경우에는 작동하지 않습니다. 단지 두 개의 문자열 만 있으므로 사전에 아무 사전도 없기 때문에 작동하지 않습니다. 귀하의 기능에서 모든 사전은 내가 생각하기에 같은 수의 사전이 있어야합니다. –

+0

아니요. 이 함수는 사전을 "열"려고합니다. 그런 다음 모든 항목을 반복합니다. 항목이 다른 사전 인 경우 해당 항목을 열어 모든 항목을 차례로 반복합니다. 이것은 (거의) 무한대로 중첩 된 사전에서 작동합니다. 엔트리가 문자열이라면, 당신이 원하는대로 무엇이든 할 수 있습니다. – TMob