连接Swift的Intift数组来创建一个新的Int

时间:2016-07-03 00:09:58

标签: arrays swift int

如何将Array<Int>[1,2,3,4])变成常规Int1234)?我可以让它走另一条路(将Int分成单个数字),但我无法弄清楚如何组合数组,以便数字组成新数字的数字。

6 个答案:

答案 0 :(得分:13)

这将有效:

let digits = [1,2,3,4]
let intValue = digits.reduce(0, combine: {$0*10 + $1})

适用于Swift 4+:

let digits = [1,2,3,4]
let intValue = digits.reduce(0, {$0*10 + $1})

或者这会编译更多版本的Swift:

(感谢Romulo BM。)

let digits = [1,2,3,4]
let intValue = digits.reduce(0) { return $0*10 + $1 }

注意

这个答案假设输入数组中包含的所有Ints都是数字 - 0 ... 9。除此之外,例如,如果您想将[1,2,3,4, 56]转换为Int 123456,您还需要其他方式。

答案 1 :(得分:3)

您也可以进行字符串转换:

Int(a.map(String.init).joined())

答案 2 :(得分:1)

编辑/更新: Swift 4或更高版本

如果你的整数集合只有一位数元素,我建议使用@OOper提供的真棒solution

如果您想将常规的整数集合加入一个整数,首先需要知道如何检查每个整数的位数:

extension BinaryInteger {
    var numberOfDigits: Int {
        return self != 0 ? Int(log10(abs(Double(self)))) + 1 : 1
    }
}

然后您可以根据每个元素的位数累计总数:

extension Collection where Element: BinaryInteger {
    var digitsSum: Int { return reduce(0, { $0 + $1.numberOfDigits }) }
    func joined() -> Int? {
        guard digitsSum <= Int.max.numberOfDigits else { return nil }
        //             (total multiplied by 10 powered to number of digits) + value
        return reduce(0) { $0 * Int(pow(10, Double($1.numberOfDigits))) + Int($1) }
    }
}
let numbers = [1,2,3,4,56]
let value = numbers.joined()  // 123456

答案 3 :(得分:0)

只是另一种解决方案

let nums:[UInt] = [1, 20, 3, 4]
if let value = Int(nums.map(String.init).reduce("", combine: +)) {
    print(value)
}

如果nums数组中的值大于10,此代码也有效。

let nums:[UInt] = [10, 20, 30, 40]
if let value = Int(nums.map(String.init).reduce("", combine: +)) {
    print(value) // 10203040
}
  

此代码要求nums数组仅包含负整数。

答案 4 :(得分:0)

let number = [1, 2, 3].reduce(0){ $0 * 10 + $1 }

print("result: \(number)") // result: 123

答案 5 :(得分:0)

您也可以

let digitsArray = [2, 3, 1, 5]
if let number = Int.init(d.flatMap({"\($0)"}).joined()) {
    // do whatever with <number>
}