2015-05-23 14 views
17

Bir Int'i kendi bireysel sayılarına ayırmaya çalışıyorum, ör. 3489 ila 3 4 8 9 ve sonra bir Int dizisine rakamlar koymak istiyorum.Swift - Split Int kendi bireysel sayılarına

Zaten bir dizeye numarası koyarak çalıştı ve ardından ilerlerken her rakam üzerinde, ancak çalışmıyor adres:

var number = "123456" 

var array = [Int]() 

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

bir fikir?

cevap

34

Güncelleme: Xcode 9 • Swift 4

Sen aşağıdaki gibi int karakter dizisi oluşturmak ve bunları flatMap edebilirsiniz

:

:

let number = "123456" 

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

Ayrıca Tamsayı protokolünü uzatabilir

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

Xco • de 8.2.1 Sen aşağıdaki gibi int karakter dizisi oluşturmak ve bunları flatMap edebilirsiniz 3.0.2

Swift:

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] 
:

let number = "123456" 

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

Ayrıca Tamsayı protokolünü uzatabilir


Düzenleme: Doisk tarafından önerildiği gibi, sonucu da katlamak için flatMap'i de kullanabilirsiniz.

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

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

Teşekkür çok Leonardo kullanabilirsiniz! Ayrıca sayıları bir dizide olduklarını ayırmak istesem ne olur? ör. değişken dizi = [456, 827] – Do2

+0

, 6 Ints veya 3 Ints? 2 dizisiyle bir dizi döndürecek mi? –

+0

1 dizi döndürecektir 6 Ints – Do2

2

bu kod çalışır:

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

bu olabilir yavaş:

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

ve

numaranız burada 9223372036854775807 en hızlı türüdür Int.max eşit veya daha az olması durumunda (ve numaranız> Int.max, bu dizgiyi büyük dizeler üzerinde çalışmak için 18 basamaklı gruplara numaranızı gösteren uzun dizelerinizi bölebilirsiniz)

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

Bu deneyebilirsiniz:

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

Doğruca numarasının Dize temsilinde karakterlerin ASCII değerini erişmek için String arasında utf8 özelliğinin yararlanabilir.

0

Bu

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 
} 

}