在Swift 2中使用分割函数

70

假设我想通过空格来分割一个字符串。这段代码在Swift 1.x中可以正常工作。但是在Xcode 7 Beta 1的Swift 2中无法工作。

var str = "Hello Bob"
var foo = split(str) {$0 == " "}

我遇到了以下编译器错误:

Cannot invoke 'split' with an argument list of type '(String, (_) -> _)

有人知道如何正确地调用它吗?

更新:添加了一条注释,说明这是针对Xcode 7 beta 1的。

3个回答

126

splitCollectionType的一个扩展方法。从Swift 2开始,String不再符合该协议。不过,幸运的是还有其他方法可以对String进行分割:

  1. 使用componentsSeparatedByString:

  2. "ab cd".componentsSeparatedByString(" ") // ["ab", "cd"]
    

    正如@dawg所指出的,这需要您import Foundation

  3. 与其在String上调用split,您可以使用String的字符。 characters属性返回一个String.CharacterView,它符合CollectionType

  4. " ".characters.split(" ").map(String.init) // ["", ""]
    
  5. 使 String 符合 CollectionType 的要求:

  6. extension String : CollectionType {}
    
    "w,x,y,z".split(",") // ["w", "x", "y", "z"]
    

    尽管自从苹果决定移除StringCollectionType的符合性后,选择选项一或二似乎更明智。


在Swift 3中,分别对应选项一和选项二:

  • componentsSeparatedByString(:)已重命名为components(separatedBy:)
  • split(:)已重命名为split(separator:)

谢谢。那很有帮助。 - Mallioch
1
似乎选项#2可能是旨在替代“Sliceable”删除的选择。 - Andrew
1
选项#1需要import Foundation,对吗? - dawg
2
值得注意的是,选项1和选项2并不相同。例如,如果您要分隔的字符串/字符出现在字符串的开头,选项1将返回一个带有额外空字符串的数组,索引为0,而选项2则不会。 - Zig
分割选项会在xCode8中产生内存泄漏。一旦我用componentsSeparatedByString替换了我的分割行,内存泄漏就消失了。 - Loebre
1
关于你的第二种解决方案:你获取了一个字符集合,然后通过任何找到的 " "分割它们。我不确定我理解剩下的部分。然后你尝试使用一个字符串构造函数将其转换为字符串/可读值?init是什么意思?难道不应该是类似于String($0)这样的东西吗? - mfaani

18

Swift 4

let str = "Hello Bob"
let strSplitArray = str.split(separator: " ")
strSplitArray.first!    // "Hello"
strSplitArray.last!     // "Bob"

Xcode 7.1.1 with Swift 2.1

let str = "Hello Bob"
let strSplit = str.characters.split(" ")
String(strSplit.first!)
String(strSplit.last!)

如果字符串中两个单词之间有多个空格,该怎么办? - zulkarnain shah
@zulkarnainshah 同样的结果。 - Warif Akhand Rishi

9
在Swift 3中,componentsSeparatedByStringsplit的用法如下。
let splitArray = "Hello World".components(separatedBy: " ") // ["Hello", "World"]

分割

let splitArray = "Hello World".characters.split(separator: " ").map(String.init) // ["Hello", "World"]

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