Использование функции разделения в 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.


person Mallioch    schedule 10.06.2015    source источник


Ответы (3)


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

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

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

    Как указал @dawg, это требует от вас import Foundation.

  2. Вместо вызова split на 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"]
    

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


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

  • componentsSeparatedByString(:) был переименован в components(separatedBy:).
  • split(:) был переименован в split(separator:).
person ABakerSmith    schedule 10.06.2015
comment
Спасибо. Это было полезно. - person Mallioch; 10.06.2015
comment
Похоже, что вариант № 2, возможно, является предполагаемой заменой удаления Sliceable. - person Andrew; 30.07.2015
comment
Вариант № 1 требует import Foundation, нет? - person dawg; 14.12.2015
comment
Стоит отметить, что вариант 1 и вариант 2 не совпадают. Например, если строка/символ, который вы разделяете, находится в начале строки, вариант 1 вернет массив с дополнительной пустой строкой в ​​индексе 0, а вариант 2 — нет. - person Zig; 10.03.2016
comment
Параметр split создает утечку памяти (по крайней мере, в xCode8). Как только я заменил разделительную линию на компоненты SerparateByString, утечка памяти исчезла. - person Loebre; 16.09.2016
comment
О вашем втором решении: вы получаете набор символов, а затем разделяете их по тому, где вы когда-либо находили " ". Я не уверен, что понимаю остальное. Итак, вы пытаетесь использовать конструктор String для преобразования в String/человекочитаемое значение? Что с init? разве это не должно быть что-то вроде String($0)? - person Honey; 04.10.2016

Свифт 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!)
person Warif Akhand Rishi    schedule 09.12.2015
comment
Что делать, если в строке есть более одного пробела между двумя словами? - person zulkarnain shah; 17.10.2016
comment
@zulkarnainshah тот же результат. - person Warif Akhand Rishi; 17.10.2016

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

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

разделить

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