![](/img/trans.png)
[英]how can I do to use same variable name, but different data type in Swift
[英]How to use variable with the same name as String Swift
我正在尝试优化我的代码。 我要执行以下操作:如果字典字典dict
中有一个位于firstNames
数组中的firstNames
我想将此元素直接写入first
变量,与second
相同,等等。这是我的代码示例。 我创建了包含链接变量firstNames
<-> first
, secondNames
<-> second
等的names
数组。另外,我尝试遍历循环并将值设置为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"]!
}
}
}
}
此代码没有任何运行时错误。 但是不幸的是,当我尝试在循环中设置val
时,没有任何反应。 我做错了还是有更好的解决方案?
谢谢你的帮助。
Swift是一种编译后的,主要是静态的语言,优化器可以自由地完全删除这些临时变量(如果不需要)。 局部变量的名称在运行时不可用。 这种方法行不通。 如果您使用字典将“第一”和“第二”作为字符串键(Paulw11指向您的位置),这可能会起作用,但这在Swift中是错误的方法。
让我们从字典开始。 这不是对字典的正确使用。 这不是字符串到字符串的任意映射。 它是特定字段标识符到值的映射。 那就是结构的定义。
“类型”确实有可能是“任意整数”,但我强烈怀疑它实际上是“受约束的值列表中的值”。 那是一个枚举。
如果我们将它们放在一起,那么dict实际上就是Element:
enum ElementType {
case one
case two
case three
case four
}
struct Element {
let type: ElementType
let word: String
}
您的名称选择器是ElementTypes的任意列表:
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) }
并获得我们的最终字符串也很简单:
let firstString = firstNames.map { $0.word }.joined(separator: ",")
let secondString = secondNames.map { $0.word }.joined(separator: ",")
尽管这段代码很清楚,但是它对元素进行了两次迭代,并对每个元素对“ NameTypes”列表进行了一次迭代。 在大多数情况下,这很好。 这是计算机的工作,但是,如果您有成千上万的元素(尤其是名称过滤列表很长),则可能会很昂贵,我们可以编写一个返回结果字符串字典的函数(通过手动重写filter
)。 如果那是您的问题,我可以写下来(如果您能更清楚地说明潜在问题),但是在大多数情况下,对于中等大小的列表,这是最好的方法。
我的猜测是'val'是临时变量,不能分配给它,这样会影响'dict'字典。
代替
val = ..
尝试使用
dict[key] = ...
另外,如果您要描述使用代码实现的目标,那就太好了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.