我有一个字符串数组。例如,这个:
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中发生了变化。
感谢
答案 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