在Swift 2中使用split函数


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的。

Answers:


126

split是一种方法的扩展CollectionType,从Swift 2开始,该方法的扩展String不再遵循。幸运的是,还有其他拆分方式String

  1. 用途componentsSeparatedByString

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

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

  2. 不用调用splita String,您可以使用的字符String。该characters属性返回一个String.CharacterView,它符合CollectionType

    "😀 🇬🇧".characters.split(" ").map(String.init) // ["😀", "🇬🇧"]
    
  3. 使String符合CollectionType

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

    尽管自从苹果公司决定取消String的一致性以来CollectionType,坚持使用一两个选项似乎更为明智。


在Swift 3中,分别在选项1和2中:

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

谢谢。那很有帮助。
Mallioch 2015年

1
看来#2选项可能是删除的预期替代Sliceable
安德鲁

1
选项#1需要import Foundation,不是吗?
dawg 2015年

2
值得注意的是,选项1和选项2不相同。例如,如果您要分隔的字符串/字符出现在字符串的开头,则选项1将返回一个数组,该数组在索引0中具有一个附加的空字符串,而选项2则不会。
Zig

1
关于第二种解决方案:您将获得字符集合,然后将它们按找到的位置进行拆分" "。我不确定我是否理解其余内容。那么,然后您尝试使用String构造函数转换为String /人类可读的值吗?是什么init?不应该是这样String($0)吗?
蜂蜜

18

斯威夫特4

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

带有Swift 2.1的Xcode 7.1.1

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

如果字符串在两个单词之间有多个空格怎么办?
zulkarnain shah 2016年

@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"]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.