2016-11-18 54 views
1

我试图利用一个串的每个单词的第一个字母里面,我有以下代码:无法在一成不变的值使用可变成员的封闭

func makeHeadline(string: String) -> String { 
     let headline = words.map { (word) -> String in 
     var word = word 
     let firstCharacter = word.remove(at: word.startIndex) 
     return "\(String(firstCharacter).uppercased())\(word)" 
     }.joined(separator: " ") 

     return headline 
    } 

不过,我得到以下错误:

Cannot use mutating member on immutable value: 'word' is a 'let' constant.

我试图字(var word)之前添加变种,但我得到的错误:

Parameters may not have the 'var' specifier.

我该如何解决这个问题?

+1

http://stackoverflow.com/q/29261218/2303865 –

+1

@LeoDabus,谢谢你,但我想实现这个功能我自己,因为TDD课程我在追随。绝对是你的解决方案避免重新发明轮子。 – lmiguelvargasf

+0

我会建议使用https://developer.apple.com/reference/foundation/nsstring/1416774-enumeratesubstringsbyWords选项 –

回答

5

做一个本地副本可变:

func makeHeadline(string: String) -> String { 
    let words = string.components(separatedBy: " ") 

    let headline = words.map { (word) -> String in 
     var word = word 
     let firstCharacter = word.removeAtIndex(word.startIndex) 
     return String(firstCharacter).uppercaseString + word 
    }.joined(separator: " ") 

    return headline 
} 
+0

你的代码工作,但有什么区别var word内幕之间的关闭和(单词)?这对我来说很困惑。顺便说一句,非常感谢你的回复。 – lmiguelvargasf

+0

我不明白你的问题,如果这是一个问题 – Alexander

+0

当你说'var word = word'编译器如何区分闭合参数和局部可变副本? – lmiguelvargasf