我正在尝试将此Extension
添加到我的代码中,以便通过单词枚举列出子字符串。该代码的来源日期为2015年,因此这显然是Swift
的较早版本。我正在使用Swift4.2
,我无法弄清楚如何在下面的注释中正确更新代码。
extension String {
func words() -> [String] {
let range = Range<String.Index>(start: self.startIndex, end: self.endIndex) // THIS LINE CAUSES ERROR
var words = [String]()
self.enumerateSubstringsInRange(range, options: NSStringEnumerationOptions.ByWords) { (substring, _, _, _) -> () in
words.append(substring)
}
return words
}
}
我最初会得到此错误:呼叫中的不正确参数标签(有'start:end:end:',预期'_:in:in:')
我遵循"修复"提示,它将行更改为:
let range = Range<String.Index>(self.startIndex, in: self.endIndex)
然后,我遇到此错误而没有修复建议:
无法将类型'string.Index'的值转换为预期参数类型'nsrange'(aka'_nsrange')
错误可能是由于Swift
版本更新,我无法找到编写此行的正确方法。
自swift3:
以来,范围方法语法中的枚举substring已改变了一点新声明:
func enumereratesubstrings(在范围:r,选项选择: string.enumerationOptions =默认,_ body:@escaping(string?,, 范围,范围,inout bool) -> void)其中r :range expression,r.bound == string.index
extension String {
func words() -> [String] {
var words = [String]()
enumerateSubstrings(in: startIndex..., options: .byWords) { substring, _, _, _ in
words.append(substring!)
}
return words
}
}
"abc def".words() // ["abc", "def"]
请注意,在Swift 4或更高版本中,您应该扩展StringProtocol
而不是String
本身,以支持Substring
S。您可以在我在此处发布的答案