Swift - Разделить Int на отдельные цифры
Я пытаюсь разбить Int на его отдельные цифры, например. 3489 до 3 4 8 9, а затем я хочу поместить цифры в массив Int.
Я уже пробовал помещать число в строку и затем повторять по каждой цифре, но это не работает:
var number = "123456"
var array = [Int]()
for digit in number {
array.append(digit)
}
Любые идеи?
Ответы
Ответ 1
Редактирование/обновление: Swift 5 вы можете использовать новое свойство персонажа wholeNumberValue
let string = "123456"
let digits = string.compactMap{ $0.wholeNumberValue } // [1, 2, 3, 4, 5, 6]
Мы также можем расширить StringProtocol и создать вычисляемое свойство:
extension StringProtocol {
var digits: [Int] {
return compactMap{ $0.wholeNumberValue }
}
}
extension LosslessStringConvertible {
var string: String { return String(self) }
}
extension Numeric where Self: LosslessStringConvertible {
var digits: [Int] {
return string.digits
}
}
let string = "123456"
let digits = string.digits // [1, 2, 3, 4, 5, 6]
let integer = 123
let digits = integer.digits // [1, 2, 3]
Ответ 2
этот код работает:
var number = "123456"
var array = number.utf8.map{Int(($0 as UInt8)) - 48}
это может быть медленнее:
var array = number.characters.map{Int(String($0))!}
и если ваш номер меньше или равен Int.max, который является 9223372036854775807, это самый быстрый вариант (и если ваш номеp > Int.max вы можете разделить длинную строку, которая представляет ваш номер, в 18-значные группы, чтобы сделать это вариантная работа над большими строками)
var array2 = [Int]()
var i = Int(number)!
while i > 0 {array2.append(i%10); i/=10}
array2 = array2.reverse()
Ответ 3
Вы можете попробовать следующее:
var number = "123456"
var array = number.utf8.map{Int($0)-48}
Вы можете использовать свойство utf8
String
для прямого доступа к значению ASCII символов в представлении String вашего номера.
Ответ 4
Решение без необходимости преобразования int в строку....
пример
1234%10 = 4 <-
1234/10 = 123
123%10 = 3 <-
123/10 = 12
12%10 = 2 <-
12/10 = 1
1%10 = 1 <-
var num = 12345
var arrayInt = [Int]()
arrayInt.append(num%10)
while num >= 10 {
num = num/10
arrayInt.insert(num%10, at: 0)
}
Ответ 5
Вы можете использовать это
extension Int {
func numberOfDigits() -> Int {
if abs(self) < 10 {
return 1
} else {
return 1 + (self/10).numberOfDigits()
}
}
func getDigits() -> [Int] {
let num = self.numberOfDigits()
var tempNumber = self
var digitList = [Int]()
for i in (0..<num).reversed() {
let divider = Int(pow(CGFloat(10), CGFloat(i)))
let digit = tempNumber/divider
digitList.append(digit)
tempNumber -= digit*divider
}
return digitList
}
}
Ответ 6
Вы можете использовать это:
// input -> "123456"
// output -> [1, 2, 3, 4, 5, 6]
// Get the string, convert it in an Array(),
// use a loop (convert i in Int()), to add it into a container, then return it. Done!
func getDigitsFromString(for string: String) -> [Int]{
let stringInt = Array(string)
var array = [Int]()
for i in stringInt {
if let i = Int(String(i)) {
array.append(i)
}
}
return array
}