Swift for 循环“表达式类型 '[[String : String]]' 在没有更多上下文的情况下模棱两可

Posted

技术标签:

【中文标题】Swift for 循环“表达式类型 \'[[String : String]]\' 在没有更多上下文的情况下模棱两可【英文标题】:Swift for-loop "Expression type '[[String : String]]' is ambiguous without more contextSwift for 循环“表达式类型 '[[String : String]]' 在没有更多上下文的情况下模棱两可 【发布时间】:2016-07-21 21:52:34 【问题描述】:

我正在尝试从字典数组中访问以下项目,但我遇到了两个问题(两者都是不同的方法)。字典数组初始化如下:

var testingArray = [[String: String]()]

testingArray.append(["name": "Ethiopia", "url": "localhost:8088"])
testingArray.append(["name": "Bugatti", "url": "localhost:8088"])
testingArray.append(["name": "Brazil", "url": "localhost:8088"])
testingArray.append(["name": "Jasmine", "url": "localhost:8088"])
testingArray.append(["name": "Hello", "url": "localhost:8088"])

第一种方法:

for (k,v) in testingArray 
    // code here

由于(出现在 for 循环初始化的那一行)而无法运行:

"Expression type '[[String : String]]' is ambiguous without more context

第二种方法:

for indices in testingArray 
    for(k, v) in indices 
        print(indices.keys)
    

返回以下内容:

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Ethiopia"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Ethiopia"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Bugatti"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Bugatti"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Brazil"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Brazil"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Jasmine"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Jasmine"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Hello"], _transform: (Function))

LazyMapCollection<Dictionary<String, String>, String>(_base: ["url": "localhost:8088", "name": "Hello"], _transform: (Function))

这是我试图实现的等效伪代码:

for(int i = 0; i < sizeOfArray; i++ 
    print testingArray[i]."name"
    print testingArray[i]."url"

这几天我一直在摸不着头脑,但我不知道 swift 及其习语足以单独解决这个问题,任何帮助将不胜感激(尤其是如果我们能弄清楚如何让 #1 工作) .

【问题讨论】:

为了使用索引迭代 swift 数组,请参阅 ***.com/a/24028458/958064 - Swift 3.0 添加了一个 enumerated() 方法,这将有助于此处的 OP 【参考方案1】:

我同意错误消息令人困惑/具有误导性。但是for (k,v) in testingArray 没有意义,因为testingArray 是一个数组,而不是字典。它的元素是字典。

我认为您正在寻找这样的东西:

for obj in testingArray 
    print(obj["name"])
    print(obj["url"])

【讨论】:

谢谢!它就像一个魅力。这是我第一次使用字典,所以第一次掌握正确的语法对我来说非常重要。它可以工作,也只是一个附带问题,因为字典是无序且不可枚举的,如果我想从 plist 加载到 PickerView,最简单的方法是将我所有的字典 kv 对存储在一个数组中,是吗? 如果您需要它们按特定顺序排列,是的,将它们放在一个数组中是最简单的。如果每个事物都包含多个属性(例如“显示名称”和“标识符”),那么使用字典数组是有意义的,就像您在示例中所做的那样。 (但是,字典可枚举的:在我的示例中,您可以执行类似for (k, v) in obj ... 的内部循环) 当你说可枚举时,这是否意味着我可以从这个函数中的字典中获取值:pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&gt; String? ,就像这样:dictionary[row]["name"] 字典本身不能被整数行号索引。如果您有一个名为array 的字典数组,那么您可以使用array[row]["name"],是的。【参考方案2】:

这行得通

for (k,v) in testingArray.enumerated() 
    for (_, element) in k.enumerated()
       guard let elem = element.value as? [String: Any] else 
            continue
       
       print elem["name"]
    

【讨论】:

以上是关于Swift for 循环“表达式类型 '[[String : String]]' 在没有更多上下文的情况下模棱两可的主要内容,如果未能解决你的问题,请参考以下文章

Swift学习笔记之---for循环与while循环

Swift学习笔记之---for循环与while循环

Swift学习笔记之---for循环与while循环

For循环用于搜索数组,Swift [重复]

Swift 2:在 for 循环中守卫?

Swift 3:如何使用 for 循环来循环数组