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

时间:2015-05-23 18:00:40

标签: swift

我正在尝试将Int分成单独的数字,例如3489到3 4 8 9,然后我想把数字放在一个Int数组中。

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

var number = "123456"

var array = [Int]()

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

有什么想法吗?

8 个答案:

答案 0 :(得分:52)

编辑/更新: 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 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]

答案 1 :(得分: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,这是最快的变体(如果您的号码> gt.Int.max,您可以将代表您的号码的长字符串拆分为18位组,以实现此目的变体在大字符串上工作)

var array2 = [Int]()
var i = Int(number)!
while i > 0 {array2.append(i%10); i/=10}
array2 = array2.reverse()

答案 2 :(得分:3)

你可以试试这个:

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

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

答案 3 :(得分: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)
}

答案 4 :(得分: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
}

}

答案 5 :(得分:1)

快捷键5

error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try`
  --> src/main.rs:46:20
   |
46 |             sum += square_result?;
   |                    ^^^^^^^^^^^^^^ the `?` operator cannot be applied to type `&std::result::Result<u64, anyhow::Error>`
   |
   = help: the trait `std::ops::Try` is not implemented for `&std::result::Result<u64, anyhow::Error>`
   = note: required by `std::ops::Try::into_result`

答案 6 :(得分: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
    }

答案 7 :(得分:0)

extension Int {
    var digits : [Int] {
        var result = [Int]()
        var remaining = abs(self)
        while remaining > 0 {
            result.insert(remaining % 10, at: 0)
            remaining /= 10
        }
        return result
    }
}