2017-06-04 64 views
0

我试图从每个数组中的单词串采取的最后一个字符变异阵列的价值:斯威夫特3 - 有问题的功能

var nonsenseArray = ["bungalow", "buffalo", "indigo", "although", "Ontario", "albino", "%$&#!"] 

,并创建一个字符串每个字符在函数内使用for-loop。我觉得我有一个很好的答案,但我得到以下错误:

cannnot use mutating member on immutable value: "every" is a "let" constant 

下面是我的代码:

func combineLastCharacters(array: [String]) -> String { 
    var myString = "" 
    var array = array 
    for every in array { 
     myString = "\(every.remove(at: every.index(before: 
     every.endIndex)))" + myString 
} 
return myString 

我从其他的答案发现,通过使用:

var array = array 

数组应该变成可变的,所以我可以使用它的remove方法。任何帮助是极大的赞赏。

我想创建的字符串是“呜呼!”

回答

0

array可能是可变的,但every不是,并且remove(at:)正试图对它进行变异。另外,你在字符串的开始追加字符。试试这个:

func combineLastCharacters(array: [String]) -> String { 
    var myString = "" 
    for var every in array { 
     myString += "\(every.remove(at: every.index(before: 
     every.endIndex)))" 
    } 
    return myString 
} 

或者只是:

func combineLastCharacters(array: [String]) -> String { 
    return array.reduce("", { $0 + String($1.characters.last!) }) 
} 
+0

现在我得到一个编译器警告,并没有输出,当我尝试打印功能。警告是:“变量数组从未突变:考虑更改为'let'常量”。我用你的建议在每个之前加var,并且解决了第一个问题。 –

+0

@Cali_Ranger关于编译器警告,请注意当复制函数时,我删除了'var array = array'行。关于没有输出:你打印什么代码? –

+0

我认为是由于编译器警告导致输出不足。一旦我删除了'var array = array',代码就工作了。 –

0

你不能改变。可变every,因为它被定义为let常数,无法改变,我想你想substring而不是remove

func combineLastCharacters(array: [String]) -> String { 
    var myString = "" 
    for every in array { 
     myString = "\(every.substring(from: every.index(before: every.endIndex)))" + myString 
    } 
    return myString 
}