如何在不转换为Swift中的String的情况下拆分或迭代Int

时间:2017-02-28 13:26:17

标签: swift

我想知道Swift是否有办法将Int分成其个别数字而不用将其转换为String。例如:

let x: Int = 12345
//Some way to loop/iterate over x's digits
//Then map each digit in x to it's String value
//Return "12345"

对于一些背景知识,我正在尝试创建自己的将Int转换为String的方法,而不使用String description属性或使用String Interpolation。

我在这个网站上发现了各种各样的文章,但是我能找到的所有文章都是以String开头,或者最后使用String描述属性将Int转换为String。

感谢。

3 个答案:

答案 0 :(得分:3)

继续除以10并取余数:

extension Int {
    func digits() -> [Int] {
        var digits: [Int] = []
        var num = self
        repeat {
            digits.append(num % 10)
            num /= 10
        } while num != 0
        return digits.reversed()
    }
}

x.digits() // [1,2,3,4,5]

请注意,如果值为负,这将返回所有负数。如果要以不同方式处理,可以添加特殊情况。这返回[0]为0,这可能是你想要的。

因为每个人都喜欢纯函数式编程,所以你也可以这样做:

func digits() -> [Int] {
    let partials = sequence(first: self) {
        let p = $0 / 10
        guard p != 0 else { return nil }
        return p
    }

    return partials.reversed().map { $0 % 10 }
}

(但我可能只是在这里使用循环。在大多数情况下,我发现sequence太难理解了。)

答案 1 :(得分:1)

递归方式......

extension Int {
    func createDigitArray() -> [Int] {
        if self < 10 {
            return [self]
        } else {
            return (self / 10).createDigitArray() + [self % 10]
        }
    }
}
12345.createDigitArray() //->[1, 2, 3, 4, 5]

答案 2 :(得分:0)

一种非常简单的方法是使用此功能:

func getDigits(of number: Int) -> [Int] {
    var digits = [Int]()
    var x = number
    repeat{
        digits.insert(abs(x % 10), at: 0)
        x/=10
    } while x != 0

    return digits
}

并像这样使用它:

getDigits(of: 97531) // [9,7,5,3,1]
getDigits(of: -97531) // [9,7,5,3,1]

正如您所看到的,对于负数,您将收到其数字的数组,但是它们的绝对值(例如:-9 => 9-99982 => 99982

希望它有所帮助!