2016-05-31 14 views

risposta

10

È possibile utilizzare il metodo String enumerateSubstringsInRange. Il primo parametro passa semplicemente i caratteri String.indices e l'opzione .ByWords. Basta aggiungere ciascuna sottostringa alla matrice finale e restituirla.

Xcode 8.1 • Swift 3.0.1 o successivo

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

Usage:

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

Enormi ringraziamenti !! Penso che la risposta dovrebbe essere accettata. – senty

3

Primo utilizzo componentsSeparatedByString di dividere la stringa in un array dallo spazio, quindi ottenere l'ultima parola della matrice utilizzando .last

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

var lastWord = stringArr.last //amet 
4

Vorrei anche considerare l'utilizzo di componentsSeparatedByCharactersInSet, e utilizzando il set di caratteri spazio bianco:

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

Mi piace il tuo approccio! Molte grazie! È possibile ottenere le ultime due parole con questo approccio o dovrei usare un ciclo for? – senty

+0

Non dimenticare di aggiungere 'import Foundation' alla risposta. L'esempio non funzionerà senza di esso. – ColGraff

+0

Funziona per me senza 'import Foundation':/ – senty

7

Le altre risposte vanno bene se si desidera includere le classi Foundation. Se si desidera utilizzare Swift-solo le classi allora si può fare in questo modo:

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"