Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 字符串的变异swift数组(swift 2)_Arrays_Swift_Swift2 - Fatal编程技术网

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

Arrays 字符串的变异swift数组(swift 2),arrays,swift,swift2,Arrays,Swift,Swift2,我有一个字符串数组。例如,这: var stringArray1 = ["abcdef", "bcdefg", "cdefgh"] 我想改变数组,去掉每个字符串的前3个字符。结果是: var newStringArray1 = ["def", "efg", "fgh"] 从苹果的文档中,我尝试了以下方法: func mutateArray(x: [String]) -> [String] { var newArray = [String]() for i in x {

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

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)
给了我一个错误:“不能对可变值使用mutating成员:”i“是一个“let”常量

我怎样才能像这样更改数组?我听说map()函数也可以使用,但在搜索map函数时,我收到的大多数解释都来自swift 1/1.2,在swift 2中有所改变

谢谢

您不能修改
for in
循环中的“counter”(在本例中不是真正的计数器)变量。使用普通循环并创建新对象

//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)
}
//标准
对于(var j=0;j
您不能修改
for in
循环中的“counter”(在本例中不是真正的计数器)变量。使用普通循环并创建新对象

//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)
}
//标准
对于(var j=0;j
两种解决方案:

  • 使用
    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个字符,则应检查输入字符串的长度。

两种解决方案:

  • 使用
    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) // ["", "", ""]
延伸 您还可以将该函数编写为
字符串的
数组
的扩展

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


请注意,我将函数的名称更改为
mutatedArray
,因为它返回一个新数组,并且没有更改原始数组。

您可以通过以下方式使用功能强大的
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) // ["", "", ""]
延伸 您还可以将该函数编写为
字符串的
数组
的扩展

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


请注意,我将函数名更改为
mutatedArray
,因为它返回一个新数组,并且没有更改原始数组。

如果将I设置为var,程序将崩溃。。。我是数组中的索引,而不是里面的字符串!哦,我不代表索引的内容,而是索引本身。这就解释了为什么我会犯这个错误。谢谢。如果您将i设置为var,程序将崩溃。。。我是数组中的索引,而不是里面的字符串!哦,我不代表索引的内容,而是索引本身。这就解释了为什么我会犯这个错误。谢谢。这里有很多很酷的东西,我不知道你能用斯威夫特做!谢谢。“extension SequenceType where Generator.Element==String”与“extension String:{//code here}”语法有什么不同吗?不同之处在于,如果您编写
扩展字符串{…}
,您将向
字符串添加一些内容。另一方面,对于
扩展SequenceType,其中Generator.Element==String{…}
当序列的元素是
字符串时(例如字符串的
数组
,因为
数组
SequenceType
一致),您正在向
SequenceType
协议添加功能。这是像Swift这样的面向协议的
语言之美的一部分:-)这里有很多很酷的东西,我不知道你可以用Swift做!谢谢。“extension SequenceType where Generator.Element==String”与“extension String:{//code here}”语法有什么不同吗?不同之处在于,如果您编写
扩展字符串{…}
,您将向
字符串添加一些内容。另一方面,对于
扩展SequenceType,其中Generator.Element==String{…}
当序列的元素是
字符串时(例如字符串的
数组
,因为
数组
SequenceType
一致),您正在向
SequenceType
协议添加功能。这是像Swift:-)这样的面向协议的
语言之美的一部分