如何使用与String Swift同名的变量

时间:2016-08-07 12:16:10

标签: ios swift swift2

我正在尝试优化我的代码。我想要执行以下操作:如果我在dict数组中的firstNames数组中有一个元素,我想将此元素直接写入first变量,与{{1}相同等等。这是我的代码示例。我创建了second数组,其中包含链接变量names< - > firstNamesfirst< - > secondNames等 此外,我正在尝试遍历循环并使用second

将值设置为firstsecond
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"]! } } } } 时,没有任何事情发生。我做错了什么或可能有更优雅的解决方案?

感谢您的帮助。

2 个答案:

答案 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] = ... 

此外,如果您要描述您尝试使用代码实现的目标,那将会很棒。