Mr.KLD
Mr.KLD

Reputation: 2742

Convert Swift string to array

How can I convert a String "Hello" to an Array ["H","e","l","l","o"] in Swift?

In Objective-C I have used this:

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
    [characters addObject:ichar];
}

Upvotes: 216

Views: 283465

Answers (14)

Fat Panda
Fat Panda

Reputation: 171

for the function on String: components(separatedBy: String)

in Swift 5.1

have change to:

string.split(separator: "/")

Upvotes: 8

Davender Verma
Davender Verma

Reputation: 573

Suppose you have four text fields otpOneTxt, otpTwoTxt, otpThreeTxt, otpFourTxt and a string getOtp.

let getup = "5642"
let array = self.getOtp.map({ String($0) })
                
otpOneTxt.text = array[0] //5
otpTwoTxt.text = array[1] //6
otpThreeTxt.text = array[2] //4
otpFourTxt.text = array[3] //2

Upvotes: 2

Manisha
Manisha

Reputation: 11

let str = "cdcd"
let characterArr = str.reduce(into: [Character]()) { result, letter in
    result.append(letter)
}
print(characterArr)
//["c", "d", "c", "d"]

Upvotes: 0

Ali Hamad
Ali Hamad

Reputation: 839

For Swift version 5.3 its easy as:

let string = "Hello world"
let characters = Array(string)

print(characters)

// ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]

Upvotes: 26

atolite
atolite

Reputation: 91

An easy way to do this is to map the variable and return each Character as a String:

let someText = "hello"

let array = someText.map({ String($0) }) // [String]

The output should be ["h", "e", "l", "l", "o"].

Upvotes: 9

devxoul
devxoul

Reputation: 2228

Edit (Swift 4)

In Swift 4, you don't have to use characters to use map(). Just do map() on String.

let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

Or if you'd prefer shorter: "ABC".map(String.init) (2-bytes 😀)

Edit (Swift 2 & Swift 3)

In Swift 2 and Swift 3, You can use map() function to characters property.

let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]

Original (Swift 1.x)

Accepted answer doesn't seem to be the best, because sequence-converted String is not a String sequence, but Character:

$ swift
Welcome to Swift!  Type :help for assistance.
  1> Array("ABC")
$R0: [Character] = 3 values {
  [0] = "A"
  [1] = "B"
  [2] = "C"
}

This below works for me:

let str = "ABC"
let arr = map(str) { s -> String in String(s) }

Reference for a global function map() is here: http://swifter.natecook.com/func/map/

Upvotes: 144

onmyway133
onmyway133

Reputation: 48055

In Swift 4, as String is a collection of Character, you need to use map

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

Upvotes: 3

ScottyBlades
ScottyBlades

Reputation: 13963

Updated for Swift 4

Here are 3 ways.

//array of Characters
let charArr1 = [Character](myString)

//array of String.element
let charArr2 = Array(myString)

for char in myString {
  //char is of type Character
}

In some cases, what people really want is a way to convert a string into an array of little strings with 1 character length each. Here is a super efficient way to do that:

//array of String
var strArr = myString.map { String($0)}

Swift 3

Here are 3 ways.

let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
  //char is of type Character
}

In some cases, what people really want is a way to convert a string into an array of little strings with 1 character length each. Here is a super efficient way to do that:

var strArr = myString.characters.map { String($0)}

Or you can add an extension to String.

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}

Then you can call it like this:

let charArr = "Cat".letterize()

Upvotes: 16

Martin R
Martin R

Reputation: 539675

It is even easier in Swift:

let string : String = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
println(characters)
// [H, e, l, l, o,  , 🐶, 🐮,  , 🇩🇪]

This uses the facts that

  • an Array can be created from a SequenceType, and
  • String conforms to the SequenceType protocol, and its sequence generator enumerates the characters.

And since Swift strings have full support for Unicode, this works even with characters outside of the "Basic Multilingual Plane" (such as 🐶) and with extended grapheme clusters (such as 🇩🇪, which is actually composed of two Unicode scalars).


Update: As of Swift 2, String does no longer conform to SequenceType, but the characters property provides a sequence of the Unicode characters:

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string.characters)
print(characters)

This works in Swift 3 as well.


Update: As of Swift 4, String is (again) a collection of its Characters:

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "🐶", "🐮", " ", "🇩🇪"]

Upvotes: 466

Frederic Adda
Frederic Adda

Reputation: 6092

There is also this useful function on String: components(separatedBy: String)

let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]

Works well to deal with strings separated by a character like ";" or even "\n"

Upvotes: 38

func letterize() -> [Character] {
    return Array(self.characters)
}

Upvotes: 1

William Hu
William Hu

Reputation: 16141

    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)

Upvotes: 3

fabmilo
fabmilo

Reputation: 48310

You can also create an extension:

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}

Upvotes: 1

Alberto Barrera
Alberto Barrera

Reputation: 329

Martin R answer is the best approach, and as he said, because String conforms the SquenceType protocol, you can also enumerate a string, getting each character on each iteration.

let characters = "Hello"
var charactersArray: [Character] = []

for (index, character) in enumerate(characters) {
    //do something with the character at index
    charactersArray.append(character)
}

println(charactersArray)

Upvotes: 4

Related Questions