如何将一个字符串拆分为[String]而不是[子字符串]?

13

考虑以下扩展:

extension Array where Element == String {
    func foo(){
    }
}

考虑以下字符串,我想将其分割以便可以使用扩展名...

let string = "This|is|a|test"
let words = string.split(separator: "|")

问题在于words是一个[Substring]而不是一个[String],所以我不能在其上调用foo()

那么在Swift 4中,我该如何拆分一个字符串以返回一个[String]而不是一个[Substring]


string.components(separatedBy: .whitespaces) 将返回一个字符串数组。 - Leo Dabus
2
如果你真的需要使用split方法,你可以将它们映射为字符串.map(String.init) - Leo Dabus
string.components(separatedBy: ."|") - Leo Dabus
理想情况下,您应该修改扩展名以适用于子字符串,我推测。 - John Dvorak
@JohnDvorak,我刚刚发布了第二个问题,特别询问如何编写一个可以与两者一起使用的扩展。您能在答案中详细说明吗? - Mark A. Donohoe
@MarqueIV,抱歉我不能,但我愿意阅读对此的答案 :-D - John Dvorak
1个回答

14

就像Leo上面所说,你可以使用components(separatedBy:)

let string = "This|is|a|test"
let words = string.components(separatedBy: "|")
words.foo()

相反,它返回一个[String]

如果您想坚持使用split()(例如,因为它具有更多选项,例如省略空子序列),那么您将不得不通过将每个Substring转换为String来创建一个新数组:

let string = "This|is|a|test"
let words = string.split(separator: "|").map(String.init)
words.foo()

或者-如果可能的话-将数组扩展方法更改为接受符合StringProtocol协议的参数, 该协议覆盖了StringSubstring

extension Array where Element: StringProtocol {
    func foo(){
    }
}

这个完美地解决了问题。而且你的 StringProtocol 解决方案实际上回答了我刚刚发布的另一个问题。请随意将其复制到那里,我也会在那里接受它。 - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接