Verwenden der Split-Funktion in Swift 2

70

Angenommen, ich möchte eine Zeichenfolge durch ein leeres Leerzeichen teilen. Dieses Code-Snippet funktioniert in Swift 1.x einwandfrei. Es funktioniert nicht in Swift 2 in Xcode 7 Beta 1.

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

Ich erhalte den folgenden Compilerfehler:

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

Weiß jemand, wie man das richtig nennt?

Aktualisiert : Es wurde ein Hinweis hinzugefügt, dass dies für den Xcode 7 Beta 1 war.

Mallioch
quelle

Antworten:

126

splitist eine Methode in einer Erweiterung CollectionType, der ab Swift 2 Stringnicht mehr entspricht. Glücklicherweise gibt es andere Möglichkeiten, a zu teilen String:

  1. Verwendung componentsSeparatedByString:

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

    Wie von @dawg hervorgehoben, erfordert dies Sie import Foundation.

  2. Statt Aufruf splitauf ein String, können Sie die Zeichen der Verwendung String. Die charactersEigenschaft gibt a zurück String.CharacterView, was entspricht CollectionType:

    "😀 🇬🇧".characters.split(" ").map(String.init) // ["😀", "🇬🇧"]
    
  3. Machen Sie Stringentsprechen CollectionType:

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

    Da Apple jedoch die Entscheidung getroffen hat, die StringKonformität mit Apple zu entfernen , CollectionTypeerscheint es sinnvoller, sich an die Optionen eins oder zwei zu halten.


In Swift 3 in den Optionen 1 und 2:

  • componentsSeparatedByString(:)wurde umbenannt in components(separatedBy:).
  • split(:)wurde umbenannt in split(separator:).
ABakerSmith
quelle
Vielen Dank. Das war hilfreich.
Mallioch
1
Es scheint, dass Option 2 möglicherweise der beabsichtigte Ersatz für das Entfernen von ist Sliceable.
Andrew
1
Option 1 braucht import Foundation, nein?
Morgengrauen
2
Es ist erwähnenswert, dass Option 1 und Option 2 nicht identisch sind. Wenn beispielsweise die Zeichenfolge / das Zeichen, durch die Sie trennen, am Anfang der Zeichenfolge angezeigt wird, gibt Option 1 ein Array mit einer zusätzlichen leeren Zeichenfolge in Index 0 zurück, Option 2 jedoch nicht.
Zig
1
Zu Ihrer zweiten Lösung: Sie erhalten eine Sammlung von Zeichen und teilen sie dann auf, wo immer Sie sie finden " ". Ich bin mir nicht sicher, ob ich den Rest verstehe. Sie versuchen also, einen String- Konstruktor zu verwenden, um ihn in einen lesbaren String / Human-Wert zu konvertieren? Was ist mit dem init? sollte es nicht stattdessen so etwas sein String($0)?
Honig
18

Swift 4

let str = "Hello Bob"
let strSplitArray = str.split(separator: " ")
strSplitArray.first!    // "Hello"
strSplitArray.last!     // "Bob"

Xcode 7.1.1 mit Swift 2.1

let str = "Hello Bob"
let strSplit = str.characters.split(" ")
String(strSplit.first!)
String(strSplit.last!)
Warif Akhand Rishi
quelle
Was ist, wenn die Zeichenfolge mehr als ein Leerzeichen zwischen den beiden Wörtern enthält?
Zulkarnain Shah
@zulkarnainshah gleiches Ergebnis.
Warif Akhand Rishi
9

In Swift 3 componentsSeparatedByStringund splitwird auf diese Weise verwendet.

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

Teilt

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