【问题标题】:Using the split function in Swift 2在 Swift 2 中使用 split 函数
【发布时间】:2015-08-25 20:55:14
【问题描述】:

假设我想用一个空格分割一个字符串。这段代码 sn-p 在 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 的。

【问题讨论】:

    标签: swift2


    【解决方案1】:

    splitCollectionType 扩展中的一个方法,从 Swift 2 开始,String 不再符合。幸运的是还有其他方法可以拆分String

    1. 使用componentsSeparatedByString

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

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

    2. 您可以使用String 的字符,而不是在String 上调用splitcharacters 属性返回一个String.CharacterView,它符合CollectionType

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

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

      虽然,由于 Apple 决定取消 StringCollectionType 的一致性,因此坚持选择一或二似乎更明智。


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

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

    【讨论】:

    • 谢谢。这很有帮助。
    • 看来选项 #2 可能是删除 Sliceable 的预期替代品。
    • 选项#1 需要import Foundation,不是吗?
    • 值得注意的是,选项1和选项2并不相同。例如,如果您要分隔的字符串/字符出现在字符串的开头,则选项 1 将返回一个数组,其中索引 0 中有一个额外的空字符串,而选项 2 则不会。
    • 关于你的第二个解决方案:你得到了一个 characters 的集合,然后你将它们按你找到" " 的位置分割。我不确定我是否理解其余部分。那么您尝试使用 String 构造函数来转换为字符串/人类可读的值吗? init 是怎么回事?不应该是 String($0) 之类的吗?
    【解决方案2】:

    斯威夫特 4

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

    Xcode 7.1.1 与 Swift 2.1

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

    【讨论】:

    • 如果字符串的两个单词之间有多个空格怎么办?
    • @zulkarnainshah 结果相同。
    【解决方案3】:

    在 Swift 3 中,componentsSeparatedByStringsplit 以这种方式使用。

    let splitArray = "Hello World".components(separatedBy: " ") // ["Hello", "World"]
    

    拆分

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

    【讨论】: