2016-05-31 6 views

Odpowiedz

10

Można użyć metody String enumerateSubstringsInRange. Pierwszy parametr po prostu przekazuj swoje ciągi znaków. Index i opcję .ByWords. Po prostu dołącz każdy podciąg do ostatecznej tablicy i zwróć go.

Xcode 8,1 • Swift 3.0.1 lub później

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 ?? "" 
    } 
} 

Zastosowanie:

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

Ogromne dzięki! Myślę, że ta odpowiedź powinna być akceptowana. – senty

3

Pierwsze użycie componentsSeparatedByString podzielić swój ciąg do tablicy przez przestrzeń, a następnie dostać ostatnie słowo tablicy używając .last

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

var lastWord = stringArr.last //amet 
4

Chciałbym również rozważyć użycie componentsSeparatedByCharactersInSet, a przy użyciu zestawu znaków białymi:

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

Podoba mi się Twoje podejście! Wielkie dzięki! Czy można uzyskać dwa ostatnie słowa z tym podejściem, czy też powinienem użyć pętli for? – senty

+0

Nie zapomnij dodać do odpowiedzi 'import Foundation'. Przykład nie zadziała bez niego. – ColGraff

+0

To działa dla mnie bez 'import Foundation':/ – senty

7

Inne odpowiedzi są w porządku, jeśli chcesz uwzględnić klasy Foundation. Jeśli chcesz użyć SWIFT-tylko klasy następnie można to zrobić w ten sposób:

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"