Swift - 将Int拆分为各自的数字

问题描述 投票:24回答:6

我试图将Int分成其个别数字,例如3489到3 4 8 9,然后我想把数字放在一个Int数组中。

我已经尝试将数字放入一个字符串然后迭代每个数字,但它不起作用:

var number = "123456"

var array = [Int]()

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

有任何想法吗?

swift
6个回答
53
投票

编辑/更新:Swift 5你可以使用新的Character属性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 Int {
    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]

Xcode 9•Swift 4.2你需要使用compactMap而不是flatMap

let string = "123456"

let digits = string.compactMap{Int(String($0))} // [1, 2, 3, 4, 5, 6]

extension Int {
    var digits: [Int] {
        return String(self).compactMap{ Int(String($0)) }
    }
}

Xcode 9•Swift 4

您可以创建一个字符数组并将它们平面映射到Int,如下所示:

let string = "123456"

let digits = string.flatMap{Int(String($0))} // [1, 2, 3, 4, 5, 6]

您还可以扩展Integer类型:

extension Int {
    var digits: [Int] {
        return String(self).flatMap{ Int(String($0)) }
    }
}

Xcode 8.2.1•Swift 3.0.2

您可以创建一个字符数组并将它们平面映射到Int,如下所示:

let string = "123456"

let digits = string.characters.flatMap{Int(String($0))} // [1, 2, 3, 4, 5, 6]

您还可以扩展Integer类型:

extension Int {
    var digits: [Int] {
        return String(self).characters.flatMap{ Int(String($0)) }
    }
}

let integer = 12345

let digits = integer.digits   // [1, 2, 3, 4, 5]

编辑:根据doisk的建议,您也可以使用flatMap来嵌套结果。

let integers = [456, 827]
let digits = integers.flatMap{$0.digits}

print(digits) // [4, 5, 6, 8, 2, 7]

3
投票

这段代码有效:

var number = "123456"
var array = number.utf8.map{Int(($0 as UInt8)) - 48}

这可能会慢一点:

var array = number.characters.map{Int(String($0))!}

如果您的数字小于或等于Int.max,即9223372036854775807,这是最快的变体(如果您的数字> 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}

您可以使用utf8String属性直接访问数字的字符串表示形式中字符的ASCII值。


3
投票

无需将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)
}

2
投票

你可以用它

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
}

}


0
投票

你可以用这个:

// 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
    }
© www.soinside.com 2019 - 2024. All rights reserved.