Ios 如何使用与字符串Swift同名的变量

Ios 如何使用与字符串Swift同名的变量,ios,swift,swift2,Ios,Swift,Swift2,我正在尝试优化我的代码。我想执行以下操作:如果字典dict中有一个元素,它位于firstNames数组中,我想将这个元素直接写入first变量,与second等相同。这里是我的代码示例。我已经创建了names数组,其中包含链接变量first,secondNames,secondNames等。 此外,我还尝试迭代循环,并使用val将值设置为first、second等 let dict = ["type": "1", "word": "abc"] // this is example

我正在尝试优化我的代码。我想执行以下操作:如果字典
dict
中有一个元素,它位于
firstNames
数组中,我想将这个元素直接写入
first
变量,与
second
等相同。这里是我的代码示例。我已经创建了
names
数组,其中包含链接变量
first
secondNames
secondNames
等。 此外,我还尝试迭代循环,并使用
val
将值设置为
first
second

    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
时,什么都没有发生。我做错了什么,或者可能有更优雅的解决方案


谢谢您的帮助。

我猜“val”是临时变量,无法赋值,因此会影响“dict”字典

而不是

val = ..
试用

dict[key] = ... 

另外,如果您能描述一下您试图用代码实现什么,那就太好了。

Swift是一种编译过的、主要是静态的语言,如果不需要,优化器可以完全删除这些临时变量。本地变量的名称在运行时不可用。这种方法行不通。如果使用字典将“first”和“second”作为字符串键(Paulw11指的就是这个键),这可能会起作用,但在Swift中这是错误的方法

让我们从dict开始。这不是字典的正确用法。这不是字符串到字符串的任意映射。它是特定字段标识符到值的映射。这就是结构的定义

“类型”可能真的是“任意整数”,但我强烈怀疑它实际上是“受约束的值列表中的值”。这是一个枚举

如果我们把这些放在一起,dict实际上是一个元素:

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]
然后,我们可以想象元素列表,而不仅仅是一个dict(我假设您实际上在这个循环之外)

现在我们的循环很简单,并且清楚地说明了它的含义

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”列表进行了一次迭代。在绝大多数情况下,这很好。这是计算机所做的,但是如果你有数千个元素(特别是如果名称筛选列表很长的话),它可能会很昂贵,我们可以编写一个函数,返回结果字符串的字典(通过手工重写
过滤器
)。如果这是你的问题,我可以写下来(如果你能更清楚地解释潜在的问题),但在大多数情况下,对于中等规模的列表,这是最好的方法。

我没有完全按照你想要的做。你能举例说明一下dict的样子吗?现在,您的
名称
变量是一个字典,名称为数组,值为字符串(
[[string],string]
)。@PaulPeelen补充道,我的问题更多的是检测是否有变量
1abc
,然后写入
1abcd
,如果有
2abc
,然后写入
2abcd
,如果我有
3abc
,那么写
3abcd
。。。我的意思是,如何从变量1的相同名称(部分相同)中获取变量2的名称您不能使用另一个变量的变量名称写入变量。使用字典,键作为“变量名”@Paulw11如果我有一个字典,键作为“变量名”,值作为变量(例如'let secondDict=[“variable”:variable]
),那么我将如何写入变量?如果我使用
secondDict[“variable”]=“smth”`我只会更新一个字典,但我需要更新
variable
。这将返回无法通过下标赋值下标是get,而且我认为,
dict[key]
将写入dict,而不是写入该位置的变量,比我要写的答案要好。但是,您可以像
let firstNameTypes:[ElementType]=[.one、.two]
这样强制转换名称选择器;我还没有决定最好的款式是什么。在第一个元素中是显式的或提供一个类型。我对哪个更好没有什么强烈的意见。(请注意,我不会称您的方法为“铸造”。这是不准确的,可能会引起混淆。您提供的是显式类型。)并排查看,我可能会更喜欢您的方法。@RobNapier感谢您的回答。当有人回答得如此详细而不是记录投票时,这真是太棒了。顺便说一句,您在第
let firstString=firstNames.map{$0.word}.joined(分隔符:“,”)
-->
类型字符串的值没有成员“joined”
@RobNapier要有无错误的答案,您可以将
.joined(分隔符:“,”
更改为.joinewithseparator(“,”)
.joined(分隔符:)
是Swift 3版本<代码>joinedWithSeparator()
是Swift 2.2版本。这是唯一的区别。
let firstString = firstNames.map { $0.word }.joined(separator: ",")
let secondString = secondNames.map { $0.word }.joined(separator: ",")