繁体   English   中英

突变字符串的迅捷数组(Swift 2)

[英]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.

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