2015-05-23 19 views
17

Tôi đang cố chia một Int thành các chữ số riêng lẻ của nó, ví dụ: 3489 đến 3 4 8 9, và sau đó tôi muốn đặt các chữ số trong một mảng Int.Swift - Tách Int thành các chữ số riêng lẻ

tôi đã cố gắng đưa các số vào một chuỗi và sau đó iterating qua mỗi chữ số, nhưng nó không hoạt động:

var number = "123456" 

var array = [Int]() 

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

Bất kỳ ý tưởng?

Trả lời

34

Cập nhật: Xcode 9 • Swift 4

Bạn có thể tạo một mảng kí tự và flatMap họ int như sau:

let number = "123456" 

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

Bạn cũng có thể mở rộng giao thức Integer:

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

Xco de 8.2.1 • Swift 3.0.2

Bạn có thể tạo một mảng kí tự và flatMap họ int như sau:

let number = "123456" 

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

Bạn cũng có thể mở rộng giao thức Integer:

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

let myInt = 12345 

let myIntArray = myInt.array // [1, 2, 3, 4, 5] 

Chỉnh sửa: Theo đề xuất của doisk, bạn có thể sử dụng flatMap cũng để lồng kết quả.

let intArray = [456, 827] 
let nestedInts = intArray.flatMap{$0.array} 

print(nestedInts) // [4, 5, 6, 8, 2, 7] 
+0

Thanks a lot Leonardo! Ngoài ra những gì nếu tôi muốn chia số mà họ đang ở trong một mảng? ví dụ var array = [456, 827] – Do2

+0

là nó sẽ trả về một mảng với 6 Ints hoặc 2 mảng của 3 Ints? –

+0

nó sẽ trả về 1 mảng 6 Ints – Do2

2

mã này hoạt động:

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

này có thể chậm hơn:

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

và nếu số của bạn là ít hơn hoặc bằng Int.max đó là 9223372036854775807 đây là phiên bản nhanh nhất (và nếu số của bạn> Int.max bạn có thể chia chuỗi dài của bạn đại diện cho số của bạn thành các nhóm 18 chữ số để biến biến này hoạt động trên các chuỗi lớn)

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

Bạn có thể thử này:

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

Bạn có thể tận dụng các utf8 tài sản của String để truy cập trực tiếp các giá trị ASCII của các nhân vật trong các đại diện chuỗi số của bạn.

0

Bạn có thể sử dụng này

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-1).reversed() { 
     let divider = Int(pow(CGFloat(10), CGFloat(i))) 
     let digit = tempNumber/divider 
     digitList.append(digit) 
     tempNumber -= digit*divider 
    } 
    return digitList 
} 

}

Các vấn đề liên quan