我正在尝试优化我的代码。我想要执行以下操作:如果我在dict
数组中的firstNames
数组中有一个元素,我想将此元素直接写入first
变量,与{{1}相同等等。这是我的代码示例。我创建了second
数组,其中包含链接变量names
< - > firstNames
,first
< - > secondNames
等
此外,我正在尝试遍历循环并使用second
first
,second
等
val
此代码没有任何运行时错误。但不幸的是,当我试图在循环中设置 let dict = ["type": "1", "word": "abc"] // this is example
let firstNames = ["1", "2"]
let secondNames = ["3", "4"]
var first = String()
var second = String()
let names = [firstNames: first, secondNames: second]
for el in dict {
for var (key, val) in names {
if (key as! [String]).contains(el["type"]!) {
if ((val as! String) != "") {
val = (val as! String) + ", " + el["word"]!
}
else {
val = el["word"]!
}
}
}
}
时,没有任何事情发生。我做错了什么或可能有更优雅的解决方案?
感谢您的帮助。
答案 0 :(得分:4)
Swift是一种编译的,主要是静态语言,如果不需要,优化器可以完全删除这些临时变量。局部变量的名称在运行时不可用。这种方法不起作用。如果您使用字典来保存"首先"它可以工作。和"第二"作为字符串键(这是Paulw11指向你的地方),但这是Swift中的错误方法。
让我们从dict开始吧。这不是词典的正确使用。这不是字符串到字符串的任意映射。它是特定字段标识符与值的映射。这是结构的定义。
"类型"真的是"一个任意整数,"但我强烈怀疑它实际上是来自受约束的价值列表的价值。"这是一个枚举。
如果我们把它们放在一起,dict就是元素:
"Principal": {
"AWS": "arn:aws:iam::123123123123:user/SQSUser"
},
您的名称选择器是ElementTypes的任意列表:
enum ElementType {
case one
case two
case three
case four
}
struct Element {
let type: ElementType
let word: String
}
然后,我们可以想象一下元素列表(我假设你实际上已经在这个循环之外),而不仅仅是一个字典。
let firstNameTypes = [ElementType.one, .two]
let secondNameTypes = [ElementType.three, .four]
现在我们的循环是微不足道的,清楚地说出它意味着什么。
let elements = [
Element(type: .one, word: "abc"),
Element(type: .two, word: "bcd"),
Element(type: .three, word: "efg"),
Element(type: .four, word: "fgh"),
]
要获得我们的最终字符串也很简单:
let firstNames = elements.filter { firstNameTypes.contains($0.type) }
let secondNames = elements.filter { secondNameTypes.contains($0.type) }
虽然这段代码非常清晰,但它会对元素进行两次迭代,然后在" NameTypes"为每个元素列出一次。在绝大多数情况下,这很好。它是计算机的功能,但如果你有数千个元素(特别是如果名称过滤列表很长),它可能很昂贵,我们可以编写一个返回结果字符串字典的函数(通过重写{ {1}}手工)。如果这是你的问题,我可以写出来(如果你能更清楚地解释基础问题),但在大多数情况下,对于适度大小的列表,这是最好的方法。
答案 1 :(得分:-2)
我的猜测是'val'是临时变量,无法分配,因此会影响'dict'字典。
而不是
val = ..
尝试使用
dict[key] = ...
此外,如果您要描述您尝试使用代码实现的目标,那将会很棒。