变异快速的字符串数组(swift 2)

时间:2015-11-14 08:26:36

标签: arrays swift swift2

我有一个字符串数组。例如,这个:

var stringArray1 = ["abcdef", "bcdefg", "cdefgh"]

我想改变数组并取出每个字符串的前3个字符。结果将是:

var newStringArray1 = ["def", "efg", "fgh"]

从Apple的文档中获取,我尝试了这个:

func mutateArray(x: [String]) -> [String] {
    var newArray = [String]()
    for i in x {
        let range =  i.startIndex.advancedBy(3)
        i.removeRange(range)
        newArray.append(i)
    }
    return newArray
}

但是这一行:

i.removeRange(range)

给了我一个错误:"不能在变异值上使用变异成员:"我"是一个"让" 。恒定"

如何更改此类数组?我听说有可能使用map()函数,但是当搜索map函数时,我收到的大部分解释都来自swift 1 / 1.2,并且它在swift 2中发生了变化。

感谢

3 个答案:

答案 0 :(得分:3)

两种解决方案:

  • 使用substringFromIndex

    func mutateArray(x: [String]) -> [String] {
      var newArray = [String]()
      for i in x {
        newArray.append(i.substringFromIndex(i.startIndex.advancedBy(3)))
      }
      return newArray
    }
    
    
    let stringArray1 = ["abcdef", "bcdefg", "cdefgh"]
    let trimmedStringArray = mutateArray(stringArray1)
    
  • 使用map

    let trimmedStringArray = stringArray1.map {$0.substringFromIndex($0.startIndex.advancedBy(3))}
    

在这两种情况下,如果输入字符串的长度不能保证总是至少有3个字符,则应检查输入字符串的长度。

答案 1 :(得分:2)

您可以这样使用强大的map功能:

func mutatedArray(array: [String]) -> [String] {
    return array.map {
        $0.substringFromIndex($0.startIndex.advancedBy(3))
    }
}

试验:

var list0 = ["abcdef", "bcdefg", "cdefgh"]
mutatedArray(list0) // ["def", "efg", "fgh"]

var list1 = ["def", "efg", "fgh"]
mutatedArray(list1) // ["", "", ""]

扩展

您还可以将该功能编写为适用于Arrays的{​​{1}}的扩展程序。

Strings

测试:

extension SequenceType where Generator.Element == String {
    func mutatedArray(removeChars: Int) -> [String] {
        return self.map {
            $0.substringFromIndex($0.startIndex.advancedBy(removeChars))
        }
    }
}

注意

请注意我将该函数的名称更改为var list1 = ["def", "efg", "fgh"] list1.mutatedArray(2) // ["f", "g", "h"] ,因为它返回了一个新数组并且它没有更改原始数组。

答案 2 :(得分:0)

您无法修改"计数器" ({1}}循环中的变量(在这种情况下不是真正的计数器)变量。使用普通循环并创建一个新对象。

for in