2016-03-23 4 views
0

У меня возникли проблемы воображая элегантный способ воссоздать в Swift следующий код:Расщепление слово в пар

В Python (правильно, кратким, элегантный):

>>> def splits(word): 
...  return [(word[:i], word[i:]) for i in range(len(word) + 1)] 
... 
>>> splits("abc") 
[('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')] 

В Swift (поддельным и немного на тяжелой стороне):

func splits(word: String) -> [(String,String)] { 
    return word.characters.indices.map { 
     return (word[word.startIndex..<$0], word[$0..<word.endIndex]) 
    } 
} 

splits("abc") 

"[("", "abc"), ("a", "bc"), ("ab", "c")]" 

Как вы можете видеть, Swift версия отсутствует тыс e последняя пара. Как я могу это достичь (помимо добавления одной последней пары вручную), зная, что индексы в символьной строке не проходят мимо последнего символа в закрытии карты?

EDIT:

Я приспособил это от ответа:

func splits(word: String) -> [(String,String)] { 
    let chars = word.characters 
    return (0...chars.count).map { 
     (String(chars.dropFirst($0)),String(chars.dropLast(chars.count - $0))) 
    } 
} 
+1

Примечание т ваш код возвращает * одну строку *, а не массив пар слов. –

+0

Обновлен вопрос на основе вашего ввода. – Laurent

ответ

1

Другое возможное решение:

func splits(word: String) -> [(String, String)] { 

    return (0 ... word.characters.count).map { 
     (word.substringToIndex(word.startIndex.advancedBy($0)), 
      word.substringFromIndex(word.endIndex.advancedBy(-$0))) 
    } 
} 

splits("abc") 
// [("", "abc"), ("a", "bc"), ("ab", "c"), ("abc", "")] 
+0

Отлично! @Martin: ты потрясающий! – Laurent

+1

, пожалуйста, обратите внимание, что требуется импортный фонд – user3441734

1

одно из возможных решений

func splits(word: String) -> [(String,String)] { 
    var arr:[(String,String)] = [] 
    (0...word.characters.count).forEach { 
     arr.append((String(word.characters.dropFirst($0)),String(word.characters.dropLast(word.characters.count - $0)))) 
    } 
    return arr 
} 

let str = "abc" 
let arr = splits(str) 
print(arr) // [("abc", ""), ("bc", "a"), ("c", "ab"), ("", "abc")] 
+0

Спасибо за указатель. Я использовал ваш «трюк» итерации по счету персонажа и переформулировал мою функцию на основе этого. Спасибо. – Laurent

Смежные вопросы