সুইফট: সমস্ত অ্যারে উপাদান মুছুন


108

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

for index 1...myArray.count {
   myArray.removeAtIndex(index)
}

তবে এটি কাজ করে না, বাল্ডিংয়ের আগে আমি এই ত্রুটিটি পেয়েছি:

প্রত্যাশিত ';' ইন 'জন্য' বিবৃতি


5
সহজ। অ্যারে পুনরায় আরম্ভ করুন ...
ভিজে

উত্তর:


326

একটি পদ্ধতি আছে (আসলে একটি ফাংশন)

myArray.removeAll()

1
এই সম্পর্কে জানতাম না, ধন্যবাদ +1
জেমসজি

11
@ নুডলঅফডিথ কঠোরভাবে কথিত সুইফট অ্যারেগুলি structএবং স্ট্রাক্টের functionsক্লাসগুলির বিপরীতে রয়েছে methods
ভাদিয়ান

1
স্পষ্টতার জন্য @vedia +1। আমি ভুলে গেছি Arrayগুলি হয় structগুলি। ভেটেরান অবজেক্টিভ সি কোডার এখানে ...
নুডলঅফডিথ

1
আপনি যেখানে এটিকে আরম্ভ করেন এমন কোনও ভিউ (ভিউকন্ট্রোলার) থেকে বেরিয়ে আসার সময় কি আপনাকে মুছে ফেলা সমস্ত () ফাংশন কল করতে হবে না, বা এটি নিজেই চলে যায় !?
ফেমিক টেক 31'17

1
@ ফ্যামিকটেক এটি নির্ভর করে: যদি ভিউটি লোড করা হয় তবে তা স্পষ্টভাবে চলে যায়, যদি ভিউটি কেবলমাত্র অদৃশ্য হয়ে যায় আপনাকে কল করতে হবে removeAll()। তবে কোনও ভিউ অদৃশ্য হয়ে গেলে সমস্ত অপ্রয়োজনীয় ডেটা অপসারণ করা ভাল (মেমরি শৃঙ্খলা) অনুশীলন।
ভাদিয়ান

17

@ ভাদিয়ানদের উত্তরটি সমাধান হ'ল এই বিষয়টি বিবেচনা করেই , আমি কেবল এটি উল্লেখ করতে চাই যে আপনার কোডটি কাজ করে না।

প্রথমত, অ্যারে সূচকগুলি 0-ভিত্তিক হয়, সুতরাং আপনার সেই অনুযায়ী পরিসীমাটি পুনর্লিখন করা উচিত:

for index 0..<myArray.count {
   myArray.removeAtIndex(index)
}

তবে এই বাস্তবায়ন বিপর্যয়ের কারণ হতে চলেছে। আপনার যদি 10 টি উপাদানের অ্যারে থাকে তবে শেষ উপাদানটি সূচক 9 এ অবস্থানটি দখল করে।

এই লুপটি ব্যবহার করে, প্রথম পুনরাবৃত্তিতে সূচক 0-এর এলিমেন্টটি সরিয়ে ফেলা হয় এবং এর ফলে শেষ উপাদানটি সূচক 8 এ নেমে যায়।

পরবর্তী পুনরাবৃত্তিতে, সূচকে 1 এ উপাদানটি সরানো হবে এবং শেষ উপাদানটি সূচী 7 এ নেমে আসে। এবং এর মতো।

লুপের এক পর্যায়ে, অ বিদ্যমান বিদ্যমান সূচকের জন্য কোনও উপাদান সরিয়ে ফেলার প্রচেষ্টা অ্যাপ্লিকেশানটিকে ক্রাশ করবে।

কোনও লুপে অ্যারে থেকে উপাদানগুলি সরানোর সময়, এটি করার সর্বোত্তম উপায় হ'ল বিপরীত ক্রমে এটি অনুসরণ করে:

for index in reverse(0..<myArray.count) {
    myArray.removeAtIndex(index)
}

এটি নিশ্চিত করে যে সরানো উপাদানগুলি এখনও ক্রিয়াকলাপে থাকা উপাদানগুলির ক্রম বা সূচি পরিবর্তন করবে না।


1
কেবলমাত্র একক লাইনে সমস্ত উপাদান সরিয়ে ফাংশন রয়েছে। @ ভাদিয়ানদের উত্তর হিসাবে ...
ভিজে

3
@ ভিজে এটিই আমি আমার উত্তরের প্রথম লাইনে লিখেছিলাম :)
আন্তোনিও

এমন কোনও সমাধানের জন্য +1 যা কোনও বস্তুর নির্দিষ্ট উদাহরণ সরিয়ে দিতে ব্যবহার করা যেতে পারে। আমি public extension Array where Element : Equatable { public mutating func remove(element: Element) -> Int { var occurrences = 0; for index in (0 ..< count).reverse() { if self[index] == element { removeAtIndex(index); occurrences += 1 } }; return occurrences } }সমস্ত একটি লাইন পছন্দ করি না তবে কোডটি একটি লাইনে সংকলন করা উচিত
নুডলঅফডিথ

কেন হবে না for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? দক্ষতা সম্পর্কে আমি এখনও খুব বেশি জানি না, তবে এইভাবে আপনাকে পরিসীমাটি বিপরীত করার প্রয়োজন হবে না, তাই এটি সম্ভবত দ্রুত।
সিবিজেউকেনড্রপ

এটাও কাজ করে! দক্ষতার দিক থেকে একই পদ্ধতি, আপনি শেষের পরিবর্তে শুরু থেকে সরিয়ে ফেলুন, তবে আপনি একটি পরিবর্তনশীল সংরক্ষণ করুন :-)
অ্যান্টোনিও

7

আপনি inকীওয়ার্ডটি হারিয়েছেন যা আপনার ত্রুটি ঘটাচ্ছে। কোডটি হওয়া উচিত:

for index in 1...myArray.count {
    myArray.removeAtIndex(index)
}

এটি অবশ্য বেশ কয়েকটি কারণে আপনি যেমন আশা করবেন তেমন কার্যকর হবে না:

  • সর্বশেষ বৈধ সূচকের count - 1যা প্রয়োজন হবে1..<myArray.count
  • আরও গুরুত্বপূর্ণভাবে অ্যারের থেকে কোনও উপাদান সরিয়ে ফেলা এটি প্রতিটি সময় সূচী পরিবর্তন করে সংক্ষিপ্ত করে তোলে।

আপনি যদি অ্যারে থেকে সমস্ত জিনিস সরিয়ে ফেলার চেষ্টা করছেন তবে অন্যের পরামর্শ ও ব্যবহার মতো আপনার করা উচিত:

myArray.removeAll()

আপনি কেবল প্রথম উপাদানটি চান এবং অন্য কোনও কিছুই আপনি প্রথম অবজেক্টের রেফারেন্স পেতে পারেননি, অ্যারেটি খালি করুন, তারপরে অবজেক্টটি আবার যুক্ত করুন:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)

দুঃখিত, আমি "ইন" দেখিনি ... +1 করেছেন
ভিজে

1
(+1) প্রকৃত ত্রুটি ব্যাখ্যা করার জন্য। (-1) কারণ এটি কাজ করবে না, কারণ কোনও আইটেম মোছার ফলে অ্যারে আরও ছোট হয়ে যায়। ( সর্বশেষ বৈধ সূচকটিও নোট করুন count - 1)।
মার্টিন আর

7

আপনি যদি সত্যিই অ্যারেটি সাফ করতে চান তবে সহজ উপায় হ'ল এটি পুনরায় আরম্ভ করা।


3

আপনার কোডটি কাজ করা উচিত, এটি সীমাবদ্ধতার বাইরে।

সুইফট 3

existingArray = []

এটি করে আপনি বিদ্যমান অ্যারে একটি খালি অ্যারে পুনরায় নিয়োগ করুন এবং ডেটা টাইপ উল্লেখ করা হয়।

বিকল্পভাবে, আপনি ব্যবহার করতে পারেন removeAllযা অ্যারে থেকে সমস্ত উপাদান সরিয়ে দেয় এবং বিদ্যমান ক্ষমতা রাখার জন্য একটি বিকল্প সরবরাহ করে।

existingArray.removeAll()

এটি এমন একটি mutatingফাংশন যার অর্থ পদ্ধতিটি কল করে অ্যারে পরিবর্তন করা হবে (খালি)।


2

কাইল সঠিক পথে রয়েছে, তবে তার কোডটি ব্যর্থ হবে কারণ গণনা করার সময় সম্ভাব্য সূচকগুলি হ্রাস পাবে এবং অবৈধ সূচকের দিকে নিয়ে যাবে।

এটির সমাধানের একটি উপায় হ'ল পিছনের দিকে গণনা করা। দ্রুতগতিতে এটি স্ট্রাইড ব্যবহার করে সম্পন্ন হয় ।

for index in stride(from: myArray.count - 1, through: 0, by: -1) {
    myArray.removeAtIndex(index)
}

অন্য বিকল্প ব্যবহার করা হবে filter()

সুইফট ১.২

myArray = filter(myArray, { (obj) -> Bool in
    return false
})

সুইফট 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}

খুব আকর্ষণীয়! আমি জানিনাstride
কাইল ডিকট

1

নেই removeAllObjects () পদ্ধতি সুইফট 2 প্রাপ্তিসাধ্য

Syntax :  public func removeAllObjects()
Eg.:   mainArray.removeAllObjects

নির্দিষ্ট সূচকের উপাদানগুলিকে অপসারণ করতে:

Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)

শেষ উপাদান ব্যবহার অপসারণ করতে:

Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()

নির্দিষ্ট পরিসীমা ব্যবহারের উপাদানগুলি অপসারণ করতে:

Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)

নির্দিষ্ট উপাদান ব্যবহার অপসারণ করতে:

Syntax : public func removeObject(anObject: AnyObject)

স্ক্রিনশটের নীচে এনএসমেটেবলআরে এক্সটেনশনে উপলব্ধ পদ্ধতির তালিকা দেখায়

স্ক্রিনশট ঘ


0

আপনি এটি করতে পারেন:

for _ in myArray
{
    myArray.removeAtIndex(0)
}

2
এই সমাধানটি ভয়াবহভাবে অদক্ষ - প্রতিটি পুনরাবৃত্তির উপরে পরবর্তী সমস্ত অবজেক্ট সূচক স্থানান্তরিত হয়। এছাড়াও, আমি নিশ্চিত নই যে এই বাস্তবায়নটি নিরাপদ। কমপক্ষে অবজেক্টিভ-সি সংগ্রহের গণনার সময় পরিব্যক্তি নিষিদ্ধ।
বোরিস ভেরেবস্কি 21

0

অ্যারের থেকে সমস্ত ডেটা অপসারণ করার জন্য

yourArrayData.removeAll()


0

আপনি যেটি সম্পাদন করতে চেষ্টা করছেন তার বিচারে ভাদিয়ানের সঠিক উত্তর রয়েছে। আপনার কোড নমুনার ফলাফল হিসাবে প্রদর্শিত সমস্যাটি আপনি forলুপটি তৈরি করার চেষ্টা করছেন due Indexডিফল্টরূপে 0 এ শুরু হবে। লুপের জন্য তৈরি করার সঠিক উপায় নয় এর পরে একটি সংখ্যা পরিসরে যোগ করা। এজন্য আপনি ত্রুটিটি দেখছেন। পরিবর্তে, নিম্নলিখিত হিসাবে আপনার লুপ জন্য তৈরি করুন:

for index in myArray.indices {
    // Do stuff
}

আশা করি, এই উত্তরটি অন্যদেরকে সহায়তা করবে যা সুইফ্ট বা প্রোগ্রামিংয়ে নতুন।


সংগ্রহটি পুনরাবৃত্তি করার সময় আপনার অ্যারে সূচকগুলির বৈশিষ্ট্যটি ব্যবহার করা উচিত। সমস্ত সংগ্রহ শূন্য সূচকে শুরু হয় না
লিও ডাবাস

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