我正在尝试将Int分成单独的数字,例如3489到3 4 8 9,然后我想把数字放在一个Int数组中。
我已经尝试将数字放入一个字符串然后迭代每个数字,但它不起作用:
var number = "123456"
var array = [Int]()
for digit in number {
array.append(digit)
}
有什么想法吗?
答案 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
}
}