[英]Mutate swift array of strings (swift 2)
我有一个字符串数组。 例如,这:
var stringArray1 = ["abcdef", "bcdefg", "cdefgh"]
我想改变数组,并取出每个字符串的前3个字符。 结果将是这样的:
var newStringArray1 = ["def", "efg", "fgh"]
从苹果公司的文档中获取,我尝试了以下方法:
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)
给我一个错误:“不能在可变值上使用变异成员:“ i”是“ let”常量。”
我该如何更改数组? 我听说过map()函数也是可行的,但是在搜索map函数时,我收到的大多数解释都来自swift 1 / 1.2,而在swift 2中却有所变化。
谢谢
两种解决方案:
使用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个字符,则应检查输入字符串的长度。
您可以通过以下方式使用功能强大的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) // ["", "", ""]
您还可以将函数编写为可用于Strings
Arrays
的扩展。
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"]
请注意,我将函数名称更改为mutatedArray
因为它返回的是新数组,而不是更改原始数组。
您不能在for in
循环中修改“计数器”(在这种情况下不是计数器)变量。 使用普通循环并创建一个新对象。
//standard for
for (var j = 0; j < x.length; j++) {
var i: String = x[i] //copy contents of object
let range = i.startIndex.advancedBy(3)
i.removeRange(range)
newArray.append(i)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.