स्विफ्ट कन्वर्ट रेंज <Int> से [Int]


107

कैसे सरणी में रेंज परिवर्तित करने के लिए

मैंने कोशिश की:

let min = 50
let max = 100
let intArray:[Int] = (min...max)

त्रुटि प्राप्त करें Range<Int> is not convertible to [Int]

मैंने भी कोशिश की:

let intArray:[Int] = [min...max]

तथा

let intArray:[Int] = (min...max) as [Int] 

वे भी काम नहीं करते।

जवाबों:


204

आप की जरूरत बनाने के लिए एक Array<Int>का उपयोग कर Range<Int>के बजाय कलाकारों यह ing।

let intArray: [Int] = Array(min...max)

1
धन्यवाद, मैंने आपको इसका उत्तर देते समय यह पता लगा लिया था कि
just

यह लगता है कि अगर सीमा बड़ी है तो दुर्घटना करें: मानों को छोड़ दें: [Int64] = Array (1 ... 4294967292) - हो सकता है क्योंकि यह केवल Int को संभाल सकता है और Int64 को नहीं?
डैनियल स्प्रिंगर

2
@DanielSpringer: यह एरे में मूल्य नहीं है, जो समस्या का कारण बनता है, लेकिन सूचकांक भाषा विनिर्देश में तय सीमा से अधिक है। इस विशाल ऐरे को धारण करने के लिए कृपया गणना करें कि आपको कितनी रैम की आवश्यकता है।
उपयोगकर्ता अज्ञात

@userunknown तो मूल्य का प्रकार नहीं है, लेकिन मूल्यों की राशि? पकड़ लिया, धन्यवाद!
डैनियल स्प्रिंगर

1
@ डैनियल स्प्रिंगर, जो एक कार्य की तरह लगता है, जहां आपको निश्चित रूप से एक रैंडम जेनर का उपयोग करना चाहिए, कुछ विकल्प यहां देखें: hackingwithswift.com/articles/102/…
क्लाउस बस


14

मैं यह समझ गया:

let intArray = [Int](min...max)

किसी और को श्रेय देना।


13

करना:

let intArray = Array(min...max)

यह काम करना चाहिए क्योंकि Arrayइसमें इनिशियलाइज़र एक है SequenceTypeऔर इसके Rangeअनुरूप है SequenceType


10

उपयोग map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

यह जोड़ना कि यह क्यों काम करता है उन लोगों के लिए फायदेमंद होगा जो इस तरह के प्रश्नों को पढ़ रहे हैं। उदाहरण के लिए कि यह एक CoutableClosedRange बनाता है जो Sequence प्रोटोकॉल को लागू करता है, इसलिए मानचित्र संभव है और मानचित्र संचालन करते समय यह एक नया int lazily पैदावार देता है। कुछ पृष्ठभूमि ज्ञान हमेशा अच्छा होता है
डेनिस 631

अन्य उत्तर दिलचस्प हैं लेकिन यह वास्तव में प्रश्न का उत्तर देता है। प्रसिद्ध बनें।
डैन रोसेनस्टार्क

3

दिलचस्प है कि आप (कम से कम, स्विफ्ट 3 और एक्सकोड 8 के साथ) Range<Int>सीधे ऑब्जेक्ट का उपयोग नहीं कर सकते हैं:

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

इसलिए, जैसा कि पहले उल्लेख किया गया था, आपको मैन्युअल रूप से "अनट्रैप" करने की आवश्यकता है:

let array: [Int] = Array(range.lowerBound...range.upperBound)

यानी, आप केवल शाब्दिक का उपयोग कर सकते हैं।


इसका कारण यह है क्योंकि Ranges संग्रह नहीं हैं। रेंज और काउंटेबल रेंज के बीच अंतर यह है कि उत्तरार्द्ध को एक इंटीजर वैल्यू से अधिक पुनरावृत्त किया जा सकता है। उस कारण से काउंटेबल रेंज स्विफ्ट में एक संग्रह प्रकार है, लेकिन रेंज नहीं है।
कोरी जाम्बोनी

यह सही है, और मैं यह उम्मीद नहीं कर रहा था, अर्थात दो अलग-अलग श्रेणी की कक्षाएं। शायद पायथन की व्याख्या के कारण range()
devforfu

1

स्विफ्ट 3 / एक्सकोड 8 के बाद से एक CountableRangeप्रकार है, जो काम कर सकता है:

let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints: 
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

यह सीधे में इस्तेमाल किया जा सकता है for- inछोरों:

for i in range {
    print(i)
}

यह (अब) कार्य को संभालने का सही तरीका है। इसके अलावा स्विफ्ट 4 में काम करता है
ऐश

0

आप इस तरह के कार्यों में कम () के साथ ClosedRange और रेंज इंस्टेंस अंतराल को लागू कर सकते हैं।

func sumClosedRange(_ n: ClosedRange<Int>) -> Int {
    return n.reduce(0, +)
}
sumClosedRange(1...10) // 55


func sumRange(_ n: Range<Int>) -> Int {
    return n.reduce(0, +)
}
sumRange(1..<11) // 55
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.