ইনডেক্স রেঞ্জ সুইফট থেকে নতুন অ্যারে


122

আমি এই জাতীয় কিছু করতে পারি? একটি অ্যারের থেকে প্রথম এন উপাদানগুলি নিন:

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
গোঁড়া বিন্দু, কিন্তু এই সত্যিই হয় না ভোটদানSlice একটি থেকে Array, বরং একটি ফালি থেকে একটি নতুন অ্যারে তৈরি করা। একটি কাস্ট asঅপারেটরটি ব্যবহার করবে : numbers as Arrayযার ফলে ত্রুটি হবে।
জেবি

ভাষা পরিবর্তিত হয়েছে, তিন ঊহ্য শব্দ ব্যবহার এবং দুই developer.apple.com/library/ios/documentation/General/Reference/...
ড্যানিয়েল Galasko

2
দুটি বিন্দু ..পরিবর্তিত হয়েছে ..<; তিনটি বিন্দুর (একটি উপবৃত্ত) একই থাকে। যদিও মনে করিয়ে দেওয়ার জন্য ধন্যবাদ; আমি উত্তর আপডেট।
সেজারি ওয়াজিক 17

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>

প্রাথমিক উপাদানগুলি সমেত দৈর্ঘ্যে সর্বোচ্চ দৈর্ঘ্য পর্যন্ত একটি উপসর্গ প্রদান করে।

অ্যাপল আরও বলেছে:

যদি সর্বাধিক দৈর্ঘ্য সংগ্রহের উপাদানগুলির সংখ্যা ছাড়িয়ে যায় তবে ফলাফলটি সংগ্রহে সমস্ত উপাদান থাকে।

অতএব, পূর্ববর্তী উদাহরণের বিকল্প হিসাবে, আপনি অন্য অ্যারের প্রথম উপাদানগুলি থেকে নতুন অ্যারে তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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)])
}

দয়া করে উত্তরে কিছু বিবরণ যুক্ত করুন।
নমন

খুব সুন্দর উত্তর। এটি মূলত যা করে তা হ'ল এটি অ্যারেতে একটি অ্যারেস্লাইস <T> কেস্ট করে। ব্যক্তিগতভাবে আমি যতগুলি দাবি অন্তর্ভুক্ত করব না। যেহেতু আমি সাধারণত চাই যদি আমি মিথ্যা পরিসীমা সরবরাহ করি তবে
ফালিটি

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 }

এই পদ্ধতির সুবিধা হ'ল এইরকম প্রয়োগ নিরাপদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.