Как преобразовать * положительный * номер в массив цифр в Swift

Я хочу преобразовать положительное число в соответствующий список цифр - цифры также должны быть Ints.

При преобразовании, скажем 1024, он должен возвращать [1,0,2,4]

Ответ 1

После некоторого поиска и некоторого метода проб и ошибок с использованием Swift REPL я придумал этот

var digits:[Int] = Array(String(number)).map { String($0).toInt()! }

Обратите внимание, что ! является критическим

Ответ 2

в Swift 4.1 или выше

let number = 1024
let digits = String(number).compactMap { Int(String($0)) }
print(digits) // [1, 0, 2, 4]

в Swift4

let number = 1024
let digits = String(number).flatMap { Int(String($0)) }
print(digits) // [1, 0, 2, 4]

в Swift2, а также в Swift3

let number = 1024
let digits = String(number).characters.flatMap { Int(String($0)) }
print(digits) // [1, 0, 2, 4]

Ответ 3

Вам не нужно сначала преобразовывать его в массив. Поскольку строки являются коллекциями, вы можете использовать свободную (не являющуюся членом) версию карты:

map(number) { String($0).toInt() }

Но будьте осторожны с вашим !. Если число когда-либо содержит нечисловую цифру, ваш код будет сбой во время выполнения. И если число отрицательное, оно начнется с "-".

Как вы хотите справиться с этим, зависит от того, что вы хотите делать с отрицательными номерами (возможно, вы хотите, чтобы все цифры были отрицательными). Но если бы вы просто захотелись бросить ведущий "-", вы могли бы сделать что-то вроде:

let strNum = number >= 0 ? String(number) : dropFirst(String(number))
let digits = map(strNum) { String($0).toInt()! }

Но на всякий случай есть еще один возможный нечисловой символ для строковых представлений целого числа, вам может показаться лучше:

let digits = map(String(number)) { String($0).toInt() }.filter { $0 != nil }.map { $0! }

Ответ 4

update: Xcode 7.0.1 • Swift 2.0

extension Int {
    var arrayOfDigits:[Int]{
        var result:[Int] = []
        for digit in description.characters {
            result.append(Int(String(digit)) ?? 0)   // (4 times)
        }
        return result
    }
    // if you would like to use your own answer as an extension woud be like this:
    var digits:[Int]{
        return description.characters.map { Int(String($0)) ?? 0 }  // (5 times)
    }
}

1234.arrayOfDigits   // [1, 2, 3, 4]
1024.digits          // [1, 0, 2, 4]