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) -> 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]]' 在没有更多上下文的情况下模棱两可的主要内容,如果未能解决你的问题,请参考以下文章