2017-08-14 46 views
2

我是新來的Swift,目前正在練習一些基本的東西,當我試圖找出爲什麼字典內容沒有排序時,我找到了某人的帖子的答案,解決方案是add之前的指數,像這樣:Swift表達式錯誤(模棱兩可,沒有更多的上下文)

[INT [字符串,字符串]]

當我試圖對它進行測試,有大約

expression type '[Dictionary<Int, Dictionary<String, Int>>]' is ambiguous without more context 

沒有錯誤想法出了什麼問題,所以我只會顯示代碼並尋求幫助。

var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]] 

for (key, (animal, num)) in animalNumbers { 
    print ("\(animal) = \(num)") 
} 

回答

1

我懷疑你可能誤解了關於數字鍵的建議。

首先,我們退後一步。我假設你原來的字典如下,你試圖解決這一問題,該命令是不保留:

let animals = ["Cat": 1, "Dog": 10, "Aye-Aye": 98] 

而且我懷疑你讀了其他答案,並得出結論,你需要將其轉換成:

let animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]] 

這是一個嵌套字典數組,每個字典都有一個數字鍵。但這沒有道理。你正在解決問題兩次。它是一個有序的字典數組,然後數字鍵也提供了以某種特定順序檢索值的機制。這是多餘的。

數字鍵的想法是讓一個字典的鍵是一個數值,其值是它們自己的字典。如果你要做到這一點,它比你有什麼有更簡單的,而是僅僅:

let animalNumbers = [0: ["Cat": 1], 1: ["Dog": 10], 2: ["Aye-Aye": 98]] 

請注意,這是用數字鍵,[Int: [String: Int]]字典。無論如何,一旦你有一個字典,你可以那麼理論上這樣做:

for i in 0 ..< animalNumbers.count { 
    for (name, value) in animalNumbers[i]! { 
     print(name, value) 
    } 
} 

但是,一逆向工程什麼,我懷疑對方的回答是在暗示,我應該說,這真的不是一個很好的模式。如果你想插入值,你必須經歷重建所有這些數字鍵的噩夢。

相反,只是用字典的簡單數組,[[String: Int]],這是有序的,但消除與手動構造數字鍵引進了不少問題:

let animals = [["Cat": 1], ["Dog": 10], ["Aye-Aye": 98]] 

然後,您可以:

for dictionary in animals { 
    for (name, value) in dictionary { 
     print(name, value) 
    } 
} 

最後,更好的是,您不應該處理字典數組,而是處理一組自定義類型:

struct Animal { 
    let name: String 
    let value: Int 
} 

let animals = [ 
    Animal(name: "Cat", value: 1), 
    Animal(name: "Dog", value: 10), 
    Animal(name: "Aye-Aye", value: 98) 
] 

現在你正在處理[Animal]類型,你可以:

for animal in animals { 
    print(animal.name, animal.value) 
} 
+0

我認爲你的回答基本上已經清除了我的想法,但我還沒有達到結構的東西,當我這樣做時,我會回顧你的問題。如果遇到有關此問題的任何信息,我會在此發佈任何進一步問題,再次感謝您的完美答覆。 – zhuqh93

0

做到像這個 -

var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]] 

     for animal in animalNumbers { 
      for (animalName, num) in animal 
      { 
       print ("\(animalName) = \(num)") 
      } 
     } 
0

這裏有兩個問題:

  • 外部對象是陣列但代碼使用字典枚舉語法。
  • 無法在同一個for循環中枚舉嵌套對象。

的解決方案是使用第二個for循環

let animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]] 

for animal in animalNumbers { 
    for (key, value) in animal { 
     print ("\(key) = \(value)") 
    } 
} 

和關於爲什麼詞典內容不排序這是一本字典是如何定義的:

字典存儲之間的關聯相同類型的鍵和集合中的相同類型的值沒有定義的排序

+0

我不知道你提到的第一個問題,你爲什麼說外部對象是一個**陣列**,系統將其檢測爲字典對象'[Dictionary >]'。我有點困惑xD – zhuqh93

+0

@ zhuqh93 - 不,這個'Dictionary'表達式附近的'['和']'表示它是一個字典數組,即'[Dictionary >]'意味着' Array >>(或使用簡寫,它是'[[Int:[String:Int]]]')。 – Rob

相關問題