Я хочу преобразовать положительное число в соответствующий список цифр - цифры также должны быть Ints.
При преобразовании, скажем 1024, он должен возвращать [1,0,2,4]
Я хочу преобразовать положительное число в соответствующий список цифр - цифры также должны быть Ints.
При преобразовании, скажем 1024, он должен возвращать [1,0,2,4]
После некоторого поиска и некоторого метода проб и ошибок с использованием Swift REPL я придумал этот
var digits:[Int] = Array(String(number)).map { String($0).toInt()! }
Обратите внимание, что !
является критическим
в 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]
Вам не нужно сначала преобразовывать его в массив. Поскольку строки являются коллекциями, вы можете использовать свободную (не являющуюся членом) версию карты:
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! }
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]