代码之家  ›  专栏  ›  技术社区  ›  Laurence Wingo

在for循环中追加到字符串时,无法对不可变值错误使用mutating成员

  •  1
  • Laurence Wingo  · 技术社区  · 8 年前

    我已经通过使用 var 关键字。但是,当尝试使用 for 循环并修改数组中的每个字符串,我得到一个编译错误,指出我不能对不可变值使用变异成员。我可以修改数组元素似乎是合乎逻辑的,因为我使用了 关键字。这是怎么变得一成不变的?同时,我也在学习数据结构。所以,我可以扩展迭代器协议并使 对于

    var temples = ["blue", "red", "green", "red"]
    
    for index in temples {
        //print(element.uppercased())
        //print(element)
        index.append(" triangles")
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Shehata Gamal    8 年前

    自从 index 是一个 let for循环中的值,不能使用 .append 有了它,你需要

    for (ind,value) in temples.enumerated()  {
      temples[ind] = "\(value) triangles" // +=
    }
    
        2
  •  1
  •   vacawama    8 年前

    String 是一个 struct for-in 循环将该值视为 let . 如果你用过 NSMutableString 它是一个可变对象(一个 class

    var temples: [NSMutableString] = ["blue", "red", "green", "red"]
    
    for str in temples {
        str.append(" triangles")
    }
    
    print(temples)
    
    [blue triangles, red triangles, green triangles, red triangles]
    

    但那不是纯粹的迅捷。


    即使通过添加 var 致 for

    var temples = ["blue", "red", "green", "red"]
    
    for var str in temples {
        str.append(" triangles")
        print(str)
    }
    
    print(temples)
    
    blue triangles
    red triangles
    green triangles
    red triangles
    ["blue", "red", "green", "red"]
    

    它不起作用,因为 str 是数组中项的副本,而不是对数组中对象的引用,因为 字符串 结构 str公司 不会更改数组值。


    那么,你怎么用斯威夫特?

    一。循环数组索引并就地修改项:

    在 indices

    var temples = ["blue", "red", "green", "red"]
    
    for index in temples.indices {
        temples[index].append(" triangles") // or temples[index] += " triangles"
    }
    
    print(temples)
    
    ["blue triangles", "red triangles", "green triangles", "red triangles"]
    

    2。使用 forEach 而不是 对于 循环:

    也可以使用 forEach公司 :

    temples.indices.forEach { temples[$0].append(" triangles") }
    

    三。使用功能方法 map :

    一种实用的方法是 地图 连接:

    temples = temples.map { $0 + " triangles" }
    

    字符串 插值:

    temples = temples.map { "\($0) triangles" }
    

    @什叶可汗 his answer 显示使用方法 enumerated 和 创建新的 替换数组中的值,而不是改变数组中的值。