7

Is it possible to put each word of a string into an array in Swift?

for instance:

var str = "Hello, Playground!"

to:

var arr = ["Hello","Playground"]

Thank you :)

b3rge
  • 4,959
  • 7
  • 23
  • 24
  • 2
    Related [Swift: Split a string into an array](http://stackoverflow.com/questions/25678373/swift-split-a-string-into-an-array) – Matthias Bauch Jan 09 '15 at 22:38

3 Answers3

8

edit/update:

Xcode 10.2 • Swift 5 or later

We can extend StringProtocol using collection split method

func split(maxSplits: Int = Int.max, omittingEmptySubsequences: Bool = true, whereSeparator isSeparator: (Character) throws -> Bool) rethrows -> [Self.SubSequence]

setting omittingEmptySubsequences to true and passing a closure as predicate. We can also take advantage of the new Character property isLetter to split the string.

extension StringProtocol {
    var words: [SubSequence] {
        return split { !$0.isLetter }
    }
}

let sentence = "• Hello, Playground!"
let words = sentence.words // ["Hello", "Playground"]
Leo Dabus
  • 229,809
  • 59
  • 489
  • 571
3

Neither answer currently works with Swift 4, but the following can cover OP's issue & hopefully yours.

extension String {
    var wordList: [String] {
        return components(separatedBy: CharacterSet.alphanumerics.inverted).filter { !$0.isEmpty }
    }
}

let string = "Hello, Playground!"
let stringArray = string.wordList
print(stringArray) // ["Hello", "Playground"]

And with a longer phrase with numbers and a double space:

let biggerString = "Hello, Playground! This is a  very long sentence with 123 and other stuff in it"
let biggerStringArray = biggerString.wordList
print(biggerStringArray)
// ["Hello", "Playground", "This", "is", "a", "very", "long", "sentence", "with", "123", "and", "other", "stuff", "in", "it"]
CodeBender
  • 35,668
  • 12
  • 125
  • 132
1

That last solution (from Leo) will create empty elements in the array when there are multiple consecutive spaces in the string. It will also combine words separated by "-" and process end of line characters as words.

This one won't :

extension String 
{    
    var wordList: [String] 
    {
       return componentsSeparatedByCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet).filter({$0 != ""})
    }
}
Alain T.
  • 40,517
  • 4
  • 31
  • 51