Подтвердить что ты не робот

Swift - Разделить Int на отдельные цифры

Я пытаюсь разбить Int на его отдельные цифры, например. 3489 до 3 4 8 9, а затем я хочу поместить цифры в массив Int.

Я уже пробовал помещать число в строку и затем повторять по каждой цифре, но это не работает:

var number = "123456"

var array = [Int]()

for digit in number {
    array.append(digit)
}

Любые идеи?

4b9b3361

Ответ 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
    }