t0re199
t0re199

Reputation: 730

How to convert a String (numeric) in a Int array in Swift

I'd like to know how can I convert a String in an Int array in Swift. In Java I've always done it like this:

String myString = "123456789";
int[] myArray = new int[myString.lenght()];
for(int i=0;i<myArray.lenght;i++){
   myArray[i] = Integer.parseInt(myString.charAt(i));
}  

Thanks everyone for helping!

Upvotes: 13

Views: 25848

Answers (8)

Leo Dabus
Leo Dabus

Reputation: 236370

You can use flatMap to convert the characters into a string and coerce the character strings into an integer:

Swift 2 or 3

let string = "123456789"
let digits = string.characters.flatMap{Int(String($0))}
print(digits)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

Swift 4

let string = "123456789"
let digits = string.flatMap{Int(String($0))}
print(digits)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

Swift 4.1

let digits = string.compactMap{Int(String($0))}

Swift 5 or later

We can use the new Character Property wholeNumberValue https://developer.apple.com/documentation/swift/character/3127025-wholenumbervalue

let digits = string.compactMap{$0.wholeNumberValue}

Swift 5.2 or later Key Path Expressions as Functions

let digits = string.compactMap(\.wholeNumberValue)

Upvotes: 19

FatMonkey
FatMonkey

Reputation: 9

let array = "0123456789".compactMap{ Int(String($0)) }
print(array)

Upvotes: 0

bajocode
bajocode

Reputation: 360

Swift 3: Functional Approach

  1. Split the String into separate String instances using: components(separatedBy separator: String) -> [String]

Reference: Returns an array containing substrings from the String that have been divided by a given separator.

  1. Use the flatMap Array method to bypass the nil coalescing while converting to Int

Reference: Returns an array containing the non-nil results of calling the given transformation with each element of this sequence.

Implementation

let string = "123456789"
let intArray = string.components(separatedBy: "").flatMap { Int($0) }

Upvotes: 0

Arjun Yadav
Arjun Yadav

Reputation: 1429

Swift 3

Int array to String

let arjun = [1,32,45,5]
    print(self.get_numbers(array: arjun))

 func get_numbers(array:[Int]) -> String {
        let stringArray = array.flatMap { String(describing: $0) }
        return stringArray.joined(separator: ",")

String to Int Array

let arjun = "1,32,45,5"
    print(self.get_numbers(stringtext: arjun))

    func get_numbers(stringtext:String) -> [Int] {
    let StringRecordedArr = stringtext.components(separatedBy: ",")
    return StringRecordedArr.map { Int($0)!}   
}

Upvotes: 2

iCode
iCode

Reputation: 113

Swift 3 update:

@appzYourLife : That's correct toInt() method is no longer available for String in Swift 3. As an alternative what you can do is :

intArray.append(Int(String(chr)) ?? 0)

Enclosing it within Int() converts it to Int.

Upvotes: 0

Aaron Rasmussen
Aaron Rasmussen

Reputation: 13316

@rintaro's answer is correct, but I just wanted to add that you can use reduce to weed out any characters that can't be converted to an Int, and even display a warning message if that happens:

let str = "123456789"
let intArray = reduce(str, [Int]()) { (var array: [Int], char: Character) -> [Int] in
    if let i = String(char).toInt() {
        array.append(i)
    } else {
        println("Warning: could not convert character \(char) to an integer")
    }
    return array
}

The advantages are:

  • if intArray contains zeros you will know that there was a 0 in str, and not some other character that turned into a zero
  • you will get told if there is a non-Int character that is possibly screwing things up.

Upvotes: 1

rintaro
rintaro

Reputation: 51911

let str = "123456789"
let intArray = map(str) { String($0).toInt() ?? 0 }
  • map() iterates Characters in str
  • String($0) converts Character to String
  • .toInt() converts String to Int. If failed(??), use 0.

If you prefer for loop, try:

let str = "123456789"
var intArray: [Int] = []

for chr in str {
    intArray.append(String(chr).toInt() ?? 0)
}

OR, if you want to iterate indices of the String:

let str = "123456789"
var intArray: [Int] = []

for i in indices(str) {
    intArray.append(String(str[i]).toInt() ?? 0)
}

Upvotes: 19

J&#233;r&#244;me
J&#233;r&#244;me

Reputation: 8066

var myString = "123456789"
var myArray:[Int] = []

for index in 0..<countElements(myString) {
    var myChar = myString[advance(myString.startIndex, index)]
    myArray.append(String(myChar).toInt()!)
}

println(myArray)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

To get the iterator pointing to a char from the string you can use advance

The method to convert string to int in Swift is toInt()

Upvotes: 0

Related Questions