70

Let's say I want to split a string by an empty space. This code snippet works fine in Swift 1.x. It does not work in Swift 2 in Xcode 7 Beta 1.

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

I get the following compiler error:

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

Anyone know how to call this correctly?

Updated: Added a note that this was for the Xcode 7 beta 1.

3 Answers 3

126

split is a method in an extension of CollectionType which, as of Swift 2, String no longer conforms to. Fortunately there are other ways to split a String:

  1. Use componentsSeparatedByString:

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

    As pointed out by @dawg, this requires you import Foundation.

  2. Instead of calling split on a String, you could use the characters of the String. The characters property returns a String.CharacterView, which conforms to CollectionType:

    "😀 🇬🇧".characters.split(" ").map(String.init) // ["😀", "🇬🇧"] 
  3. Make String conform to CollectionType:

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

    Although, since Apple made a decision to remove String's conformance to CollectionType it seems more sensible to stick with options one or two.


In Swift 3, in options 1 and 2 respectively:

  • componentsSeparatedByString(:) has been renamed to components(separatedBy:).
  • split(:) has been renamed to split(separator:).
Sign up to request clarification or add additional context in comments.

5 Comments

It would seem that option #2 is possibly the intended replacement for the removal of Sliceable.
Option #1 needs import Foundation, no?
It's worth noting that option 1 and option 2 are not the same. For example, if the string/character you are separating by appears at the beginning of the string, option 1 will return an array with an additional empty string in index 0, where option 2 will not.
The split option generates a memory leak (in xCode8 at least). Once I replaced my split line for the componentsSerparateByString the memory leak was gone.
About your 2nd solution: You are getting a collection of characters and then you split them by where ever you find " ". I am not sure I understand the rest. So then you try to use a String constructor to convert to a String/human readable value? What's with the init? shouldn't it instead be something like String($0)?
18

Swift 4

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

Xcode 7.1.1 with Swift 2.1

let str = "Hello Bob" let strSplit = str.characters.split(" ") String(strSplit.first!) String(strSplit.last!) 

2 Comments

What if the string has more than one spaces between the two words ?
@zulkarnainshah same result.
9

In Swift 3 componentsSeparatedByString and split is used this way.

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

split

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.