2015-05-23 12 views
17

मैं एक इंट को अपने व्यक्तिगत अंकों में विभाजित करने की कोशिश कर रहा हूं, उदा। 3489 से 3 4 8 9, और फिर मैं अंकों को एक int सरणी में रखना चाहता हूं।स्विफ्ट - स्प्लिट इंट अपने व्यक्तिगत अंक

मैं पहले से ही तो बार-बार दोहराना प्रत्येक अंक के ऊपर एक स्ट्रिंग में नंबर डाल की कोशिश की है और है, लेकिन यह काम नहीं करता है:

var number = "123456" 

var array = [Int]() 

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

कोई भी विचार?

उत्तर

34

अद्यतन: Xcode 9 • स्विफ्ट 4

आप पात्रों में से एक सरणी बनाने और उन्हें flatMap कर सकते हैं इस प्रकार Int करने के लिए:

:

let number = "123456" 

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

तुम भी पूर्णांक प्रोटोकॉल का विस्तार कर सकते

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

एक्सको डी 8.2.1 • स्विफ्ट 3.0.2

आप पात्रों में से एक सरणी बनाने और उन्हें flatMap कर सकते हैं इस प्रकार Int करने के लिए:

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] 

तुम भी पूर्णांक प्रोटोकॉल का विस्तार कर सकते


संपादित करें: जैसा कि डूस्क द्वारा सुझाया गया है, आप परिणाम को घोंसला करने के लिए फ्लैटमैप का भी उपयोग कर सकते हैं।

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

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

धन्यवाद एक बहुत लियोनार्डो उपयोग कर सकते हैं! इसके अलावा अगर मैं संख्याओं को विभाजित करना चाहता हूं तो वे एक सरणी में थे? उदाहरण के लिए var array = [456, 827] – Do2

+0

क्या यह 3 इंट्स के 6 इंट्स या 2 एरे के साथ एक सरणी वापस करने जा रहा है? –

+0

यह 1 सरणी 6 इन्स – Do2

2

इस कोड काम करता है:

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

इस हो सकता है धीमी:

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

और अपना नंबर Int.max जो यहाँ 9223372036854775807 है सबसे तेजी से संस्करण है से कम या बराबर है अगर (और यदि आपका नंबर> Int.max आप अपनी लंबी स्ट्रिंग को विभाजित कर सकते हैं जो इस संख्या को बड़े तारों पर काम करने के लिए 18 अंकों वाले समूहों में दर्शाता है)

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

आप इस कोशिश कर सकते हैं:

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

आप सीधे अपने नंबर की स्ट्रिंग प्रतिनिधित्व में पात्रों में से ASCII मूल्य का उपयोग करने की String की utf8 संपत्ति का उपयोग कर सकते हैं।

0

आप इस

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 
} 

}

संबंधित मुद्दे