【问题标题】:Swift expression error (ambiguous without more context)Swift 表达式错误(在没有更多上下文的情况下模棱两可)
【发布时间】:2018-01-21 22:28:47
【问题描述】:

我是 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)")
}

【问题讨论】:

    标签: swift


    【解决方案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)
    }
    

    【讨论】:

    • 我想你的回答基本上让我清醒了,但我还没有达到结构的东西,当我这样做时,我会审查你的问题。如果我遇到任何有关此问题的任何问题,我将在此处发布任何进一步的问题,再次感谢您的完美回答。
    【解决方案2】:

    这样做-

    var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]
    
            for animal in animalNumbers {
                for (animalName, num) in animal
                {
                    print ("\(animalName) = \(num)")
                }
            }
    

    【讨论】:

      【解决方案3】:

      有两个问题:

      • 外部对象是数组,但代码使用字典枚举语法。
      • 您不能在同一个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)")
          }
      }
      

      关于为什么字典内容没有排序这就是字典的定义方式:

      字典存储集合中相同类型的键和相同类型的值之间的关联没有定义的顺序

      【讨论】:

      • 我不确定你提到的第一个问题,为什么你说外部对象是一个数组,系统将其检测为字典对象[Dictionary&lt;Int, Dictionary&lt;String, Int&gt;&gt;]。我有点困惑xD
      • @zhuqh93 - 不,[]Dictionary 表达式周围表示它是一个字典数组,即 [Dictionary&lt;Int, Dictionary&lt;String, Int&gt;&gt;] 表示 Array&lt;Dictionary&lt;Int, Dictionary&lt;String, Int&gt;&gt;&gt;(或使用简写,这是[[Int: [String: Int]]])。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多