2016-03-23 18 views
0

Ich habe Probleme eine elegante Art und Weise darstellend in Swift den folgenden Code neu zu erstellen:Splitting ein Wort in Paare

In Python (richtig, prägnant, elegant):

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

In Swift (Schein- und ein bisschen auf der schweren Seite):

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")]" 

Wie Sie sehen können, die Swift-Version fehlt th Das letzte Paar. Wie kann ich dies erreichen (abgesehen davon, dass ich ein letztes Paar manuell angehängt habe), wenn ich weiß, dass die Indizes der Zeichenkette nicht das letzte Zeichen der Kartenschließung passieren?

EDIT:

I angepasst dies aus der Antwort:

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

Hinweis t Hat Ihr Code eine * einzelne Zeichenfolge * und kein Array von Wortpaaren zurückgegeben. –

+0

Die Frage wurde basierend auf Ihrer Eingabe aktualisiert. – Laurent

Antwort

1

Eine andere mögliche Lösung:

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

Großartig! @Martin: Du bist erstaunlich! – Laurent

+1

Bitte beachten Sie, dass Import Foundation benötigt wird – user3441734

1

eine mögliche Lösung

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

Danke für den Zeiger. Ich habe deinen "Trick" benutzt, um auf die Anzahl der Zeichen zu iterieren und habe meine Funktion auf dieser Basis neu formuliert. Vielen Dank. – Laurent