2016-05-31 7 views

Antwort

10

können Sie String-Methode enumerateSubstringsInRange verwenden. Erster Parameter übergeben Sie einfach Ihre String-Zeichen.indices und die Option .ByWords. Hängen Sie einfach jeden Teilstring an das letzte Array an und geben Sie es zurück.

Xcode 8.1 • Swift 3.0.1 oder später

extension String { 
    var byWords: [String] { 
     var byWords:[String] = [] 
     enumerateSubstrings(in: startIndex..<endIndex, options: .byWords) { 
      guard let word = $0 else { return } 
      print($1,$2,$3) 
      byWords.append(word) 
     } 
     return byWords 
    } 
    func firstWords(_ max: Int) -> [String] { 
     return Array(byWords.prefix(max)) 
    } 
    var firstWord: String { 
     return byWords.first ?? "" 
    } 
    func lastWords(_ max: Int) -> [String] { 
     return Array(byWords.suffix(max)) 
    } 
    var lastWord: String { 
     return byWords.last ?? "" 
    } 
} 

Verbrauch:

let sentence = "Out of this world!!!" 
let firstWord = sentence.firstWord  // "Out" 
let lastWord = sentence.lastWord   // world" 
let words = sentence.byWords    // ["Out", "of", "this", "world"] 
let first2Words = sentence.firstWords(2) // ["Out", "of"] 
let last2Words = sentence.lastWords(2) // ["this", "world"] 

Swift 2

extension String { 
    var byWords: [String] { 
     var result:[String] = [] 
     enumerateSubstringsInRange(characters.indices, options: .ByWords) { 
      guard let substring = $0.substring else { return } 
      result.append(substring) 
     } 
     return result 
    } 
} 
+1

Vielen Dank !! Ich denke, dass diese Antwort die akzeptierte sein sollte. – senty

3

Erster Einsatz componentsSeparatedByString Ihre String in ein Array von Raum zu teilen, erhält dann das letzte Wort des Arrays .last

var string = "Lorem ipsum dolor sit amet" 
var stringArr = string.componentsSeparatedByString(" ") 

var lastWord = stringArr.last //amet 
4

mit würde ich halte auch componentsSeparatedByCharactersInSet verwenden und mit dem Leerzeichensatz:

let string = "Lorem ipsum dolor sit amet" 
let stringArray = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
print(stringArray.last) 
+0

Ich mag Ihren Ansatz! Danke vielmals! Ist es möglich, die letzten beiden Wörter mit diesem Ansatz zu erhalten oder sollte ich eine for-Schleife verwenden? – senty

+0

Vergessen Sie nicht, 'import Foundation' zur Antwort hinzuzufügen. Das Beispiel wird ohne es nicht funktionieren. – ColGraff

+0

Es funktioniert für mich ohne 'import Foundation':/ – senty

7

Die anderen Antworten sind in Ordnung, wenn Sie Foundation-Klassen einbeziehen möchten. Wenn Sie Swift-only-Klassen verwenden möchten, dann können Sie es tun, auf diese Weise:

Swift 3:

let str = "Lorem ipsum dolor sit amet" 
let split = str.characters.split(separator: " ") 
let last = String(split.suffix(1).joined(separator: [" "])) 
let lastTwo = String(split.suffix(2).joined(separator: [" "])) 

print(last) // -> "amet" 
print(lastTwo) // -> "sit amet” 

Swift 2:

let str = "Lorem ipsum dolor sit amet" 
let split = str.characters.split(Character(" ")) 
let last = String(split.suffix(1).joinWithSeparator([" "])) 
let lastTwo = String(split.suffix(2).joinWithSeparator([" "])) 

print(last) // -> "amet" 
print(lastTwo) // -> "sit amet"