Использование функции split в Swift 2

Скажем, я хочу разбить строку на пустое пространство. Этот фрагмент кода отлично работает в Swift 1.x. Он не работает в Swift 2 в Xcode 7 Beta 1.

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

Я получаю следующую ошибку компилятора:

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

Кто-нибудь знает, как правильно это назвать?

Обновлено: добавлено примечание, что это было для Xcode 7 beta 1.

Ответ 1

split - это метод в расширении CollectionType, который, как и Swift 2, String уже не соответствует. К счастью, есть и другие способы разделить String:

  • Используйте componentsSeparatedByString:

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

    Как указано @dawg, для этого требуется import Foundation.

  • Вместо вызова split на String вы можете использовать символы String. Свойство characters возвращает a String.CharacterView, который соответствует CollectionType:

    "😀 🇬🇧".characters.split(" ").map(String.init) // ["😀", "🇬🇧"]
    
  • Сделайте String совместимым с CollectionType:

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

    Хотя, поскольку Apple приняло решение удалить String соответствие CollectionType, кажется более разумным придерживаться вариантов один или два.


В Swift 3 в вариантах 1 и 2 соответственно:

  • componentsSeparatedByString(:) был переименован в components(separatedBy:).
  • split(:) был переименован в split(separator:).

Ответ 2

Swift 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!)

Ответ 3

В Swift 3 componentsSeparatedByString и split используется таким образом.

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

Раскол

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