इंडेक्स रेंज स्विफ्ट से नया ऐरे


122

मैं ऐसा कुछ कैसे कर सकता हूं? किसी सरणी से पहला n तत्व लें:

newNumbers = numbers[0..n]

वर्तमान में निम्न त्रुटि हो रही है:

error: could not find an overload for 'subscript' that accepts the supplied arguments

संपादित करें:

यहां वह फ़ंक्शन है जो मैं काम कर रहा हूं।

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = numbers[0...position]
    return newNumbers
}

जवाबों:


179

यह मेरे लिए काम करता है:

var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]

आपकी समस्या यह हो सकती है कि आप अपनी सरणी को किस प्रकार शुरू करने की घोषणा कर रहे हैं।

संपादित करें:

अपने कार्य को ठीक करने के लिए, आपको अपनी Sliceसारणी में डालना होगा :

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = Array(numbers[0..<position])
    return newNumbers
}

// test
aFunction([1, 2, 3], 2) // returns [1, 2]

मैंने अपने प्रश्न में थोड़ा और संदर्भ जोड़ा है, मैं एक फ़ंक्शन के अंदर काम कर रहा हूं। यह स्वतंत्र रूप से काम करता है, लेकिन फ़ंक्शन के अंदर नहीं।
चार्ली इगन

1
लवली! चीयर्स - वह काम करता है। जब मैं इसकी अनुमति दूंगा तो मैं इसका जवाब दूंगा।
चार्ली इगन

23
सकारात्मक बिंदु, लेकिन यह वास्तव में एक के लिए कास्टिंग नहीं है , बल्कि एक स्लाइस से एक नया सरणी बना रहा है। एक कलाकार ऑपरेटर का उपयोग करेगा : जिसके परिणामस्वरूप त्रुटि होगी। SliceArrayasnumbers as Array
jb

भाषा बदल गई है, यह तीन अंडाकार उपयोग करता है और न दो developer.apple.com/library/ios/documentation/General/Reference/...
डैनियल Galasko

2
दो डॉट्स में ..बदल गया ..<; तीन बिंदु (एक दीर्घवृत्त) एक ही रहे हैं। अनुस्मारक के लिए धन्यवाद, यद्यपि; मैंने जवाब अपडेट किया।
Cezary Wojcik

100

# 1। Arrayरेंज के साथ सबस्क्रिप्ट का उपयोग करना

5 स्विफ्ट के साथ, जब आप लिखते हैं ...

let newNumbers = numbers[0...position]

... newNumbersप्रकार का नहीं है, Array<Int>लेकिन प्रकार का है ArraySlice<Int>। ऐसा इसलिए है क्योंकि Arrayके subscript(_:​)रिटर्न एक ArraySlice<Element>है कि, एप्पल के अनुसार, उपहार कुछ बड़े सरणी के भंडारण पर एक दृश्य।

इसके अलावा, स्विफ्ट Arrayएक इनिशियलाइज़र भी प्रदान करता है जो init(_:​)हमें एक sequence(सहित ArraySlice) से एक नई सरणी बनाने की अनुमति देता है ।

इसलिए, आप उपयोग कर सकते हैं subscript(_:​)के साथ init(_:​)पहले से एक नई सरणी प्राप्त करने के क्रम में एन एक सरणी के तत्वों:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[0..<3] // using Range
//let arraySlice = array[0...2] // using ClosedRange also works
//let arraySlice = array[..<3] // using PartialRangeUpTo also works
//let arraySlice = array[...2] // using PartialRangeThrough also works
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

# 2। का उपयोग करते हुए Arrayकी prefix(_:)विधि

स्विफ्ट prefix(_:)प्रकारों के लिए एक विधि प्रदान करता है जो Collectionप्रोटोकॉल के अनुरूप है (सहित Array)। prefix(_:)निम्नलिखित घोषणा है:

func prefix(_ maxLength: Int) -> ArraySlice<Element>

प्रारंभिक तत्वों से युक्त, लंबाई में अधिकतम गति तक, बाद का रिटर्न देता है।

Apple भी बताता है:

यदि संग्रह में अधिकतम लंबाई तत्वों की संख्या से अधिक है, तो परिणाम में संग्रह में सभी तत्व शामिल हैं।

इसलिए, पिछले उदाहरण के विकल्प के रूप में, आप दूसरे कोड के पहले तत्वों से एक नया सरणी बनाने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array.prefix(3)
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

7
func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}

कृपया उत्तर के रूप में कुछ विवरण जोड़ें।
नमन

बहुत अच्छा जवाब। यह अनिवार्य रूप से क्या करता है कि यह एक ArraySlice <T> को Array करता है। व्यक्तिगत रूप से मैं उतने मुखर शामिल नहीं करूंगा। जैसा कि मैं आमतौर पर स्लाइस चाहता हूं कि अगर मैं झूठी सीमाएं प्रदान करूं तो मैं विफल हो
जाऊंगा

0

एक और अधिक संस्करण का उपयोग कर extensionऔर तर्क नामrange

यह एक्सटेंशन का उपयोग करता है RangeऔरClosedRange

extension Array {

    subscript (range r: Range<Int>) -> Array {
        return Array(self[r])
    }


    subscript (range r: ClosedRange<Int>) -> Array {
        return Array(self[r])
    }
}

टेस्ट:

func testArraySubscriptRange() {
    //given
    let arr = ["1", "2", "3"]

    //when
    let result = arr[range: 1..<arr.count] as Array

    //then
    XCTAssertEqual(["2", "3"], result)
}

func testArraySubscriptClosedRange() {
    //given
    let arr = ["1", "2", "3"]

    //when
    let result = arr[range: 1...arr.count - 1] as Array

    //then
    XCTAssertEqual(["2", "3"], result)
}

0

कार्यात्मक तरीका:

   array.enumerated().filter { $0.offset < limit }.map { $0.element }

लेकर:

 array.enumerated().filter { $0.offset >= minLimit && $0.offset < maxLimit }.map { $0.element }

इस पद्धति का लाभ इस तरह के कार्यान्वयन सुरक्षित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.