Разделить строку с более чем одним символом в Swift

Я читал другие темы, но они, кажется, имеют дело только с разделителями из одного символа, и я думаю, что Playground дает сбой для меня, потому что я использую более одного символа.

"[0, 1, 2, 1]".characters
              .split(isSeparator: {[",", "[", "]"].contains($0)}))
              .map(String.init) //["0", " 1", " 2", " 1"]

вроде работает, но я хочу использовать "," не ",". Очевидно, что я могу использовать [",", " ", "[", "]"] и это выбрасывает пробелы, но как насчет того, чтобы удалить только строковые шаблоны?

Вкратце: как мне разделить строку Swift точно на другую меньшую строку (строки)?


person Richard Birkett    schedule 20.04.2016    source источник


Ответы (2)


Свифт 3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains(String($0)) }
let trimmed = splitted.map { String($0).trimmingCharacters(in: .whitespaces) }

Свифт 2

let s = "[0, 1, 2, 1]"
let charset = NSCharacterSet.whitespaceCharacterSet()
let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)})
let trimmed = splitted.map { String($0).stringByTrimmingCharactersInSet(charset) }

Результатом является массив строк без лишних пробелов:

["0", "1", "2", "1"]

person Eric Aya    schedule 20.04.2016
comment
Спасибо. Итак, мы говорим, что нет решения Swift, только решения Obj-C? - person Richard Birkett; 20.04.2016
comment
Это гениально! - person Pierce; 17.01.2017

На ум приходит пара возможностей. Если вы можете использовать символы в качестве разделителей:

let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet).filter({return !$0.isEmpty})

Это дает

["0", " 1", " 2", "1"]

При необходимости пробелы можно удалить, либо сопоставив с stringByTrimmingCharactersInSet, либо добавив пробел к separatorSet.

Или, если вам действительно нужно использовать строки в качестве разделителей:

let str = "[0, 1, 2, 1]"
let separators = [", ", "[", "]"]
let comps = separators.reduce([str]) { (comps, separator) in
    return comps.flatMap { return $0.componentsSeparatedByString(separator) }.filter({return !$0.isEmpty})
}

Который дает:

["0", "1", "2", "1"]

person Casey Fleser    schedule 20.04.2016
comment
Скопировав и вставив ваш первый код напрямую, я получил [0, 1, 2, 1], что составляет половину моей проблемы, Swift ненавидит пробелы. - person Richard Birkett; 20.04.2016
comment
Ах да ты прав. Виноват. Вы можете запустить каждый через stringByTrimmingCharactersInSet или добавить пробел в NSCharacterSet. Я отредактирую свой ответ, чтобы отразить это. - person Casey Fleser; 20.04.2016