繁体   English   中英

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

[英]How to use variable with the same name as String Swift

我正在尝试优化我的代码。 我要执行以下操作:如果字典字典dict中有一个位于firstNames数组中的firstNames我想将此元素直接写入first变量,与second相同,等等。这是我的代码示例。 我创建了包含链接变量firstNames <-> firstsecondNames <-> second等的names数组。另外,我尝试遍历循环并将值设置为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"]!
                }
            }
        }
    }

此代码没有任何运行时错误。 但是不幸的是,当我尝试在循环中设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM