সুইফট 3 এ অ্যারে থেকে অবজেক্ট সরিয়ে ফেলা হচ্ছে


93

আমার অ্যাপ্লিকেশনটিতে আমি সেলটি নির্বাচন করার সময় অ্যারেতে একটি অবজেক্ট যুক্ত করেছি এবং সেলটি পুনরায় নির্বাচন করার সময় অপসलेक्ट এবং অবজেক্টটি সরিয়ে ফেললাম। আমি সেই কোডটি ব্যবহার করেছি তবে আমাকে ত্রুটি দিন।

extension Array {
    func indexOfObject(object : AnyObject) -> NSInteger {
        return (self as NSArray).indexOfObject(object)
    }

    mutating func removeObject(object : AnyObject) {
        for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) {
            self.removeAtIndex(index)
        }
    }
}

class MyViewController: UITableViewController {
    var arrContacts: [Any] = []
    var contacts: [Any] = []

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        arrContacts.removeObject(contacts[indexPath.row])
    }
}

এটি আমাকে এর মতো 2 ত্রুটি দেয়:

C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'

আপনি Set<Contact>অ্যারের পরিবর্তে একটি ব্যবহার করতে পারেন । আপনি কি আপনার যোগাযোগের অবজেক্ট সম্পর্কে আরও তথ্য সরবরাহ করতে পারেন? যদি আপনি নিজেই এটি তৈরি করে থাকেন তবে আপনাকে এটির সাথে সামঞ্জস্য করার প্রয়োজন হবে Hashableএবং Equatableএটি একটি সেটে রাখার জন্য
Paulw11

উত্তর:


166

সুইফট সমতুল্য করার NSMutableArray'র removeObjectহল:

var array = ["alpha", "beta", "gamma"]

if let index = array.firstIndex(of: "beta") {
    array.remove(at: index)
}

যদি বিষয়গুলি অনন্য হয় । কাস্ট করা NSArrayএবং ব্যবহার করার প্রয়োজন নেইindexOfObject:

এপিআইও index(of:কাজ করে তবে এটি অপ্রয়োজনীয় অন্তর্ভুক্ত সেতুতে কাস্ট হয়ে যায় NSArray

একই বস্তু ব্যবহারের একাধিক ঘটনা উপস্থিত থাকলে filter। তবে ডেটা সোর্স অ্যারেগুলির মতো ক্ষেত্রে যেখানে সূচকটি কোনও নির্দিষ্ট অবজেক্টের সাথে যুক্ত থাকে firstIndex(ofতত দ্রুত কারণ এটি তার চেয়ে দ্রুত filter

হালনাগাদ:

সুইফট ৪.২+ এ আপনি এর betaসাথে এক বা একাধিক উপস্থিতি সরাতে পারেন removeAll(where:):

array.removeAll{$0 == "beta"}

34
এটি সেরা উত্তর, তবে মুছে ফেলা (অবজেক্ট: "বিটা") না রাখা বোকামির বাইরে।
জিপলে

4
আমি মনে করি .index(of: কেবলমাত্র যদি সংগ্রহের Equatableধরণ থাকে তবে উপলভ্য ।
অ্যাডাম ওয়েট

@ অ্যাডামওয়েট হ্যাঁ তবে এটি ফাউন্ডেশনের ধরণের ক্ষেত্রেও প্রযোজ্য।
ভাদিয়ান

এটি ঠিক নয়, আপনার যদি একাধিক "বিটা" থাকে তবে কী হবে? এটি কেবল তখনই কাজ করে যদি অ্যারেতে একাধিক ঘটনা উপস্থিত না থাকে। সঠিক উত্তরটি একটি ফিল্টার ব্যবহার করছে বা এই উত্তরটি কিছুক্ষণের মধ্যে চালাচ্ছেwhile let index = array.index(of: "beta") { array.remove(at: index) }
জুনচাজাল্লা

@ জুয়ানকাজাল্লা আপনি ঠিক বলেছেন তবে ক্ষেত্রে যদি অ্যারেটিতে একাধিক ঘটনা থাকতে পারে তবে filterসমাধানটি ব্যবহার করুন । তবে যদি বস্তুগুলি সর্বদা অনন্য ব্যবহার হয় index(ofকারণ এটি filter
31:38

72
var a = ["one", "two", "three", "four", "five"]

// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }

7
এটি হ'ল সঠিক সুইফট সমাধান, এটি ভাষায় প্রস্তাবিত সিনট্যাক্স গুডি ব্যবহার করে।
মাইকেল

4
আইটেম যদি একটি বস্তু হয়?
টমসওয়ায়ার

@ টমসওয়ারকে একটি অবজেক্ট ফিল্টার করতে $ 0! ==
মাইক ট্যাভার্ন

25

সুইফ্ট 3 এর জন্য, আপনি সূচক (যেখানে :) ব্যবহার করতে পারেন এবং এমন একটি ক্লোজার অন্তর্ভুক্ত করতে পারেন যা অ্যারেতে কোনও বস্তুর তুলনা করে ($ 0) আপনি যা খুশি তা দিয়ে with

var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
  array.remove(at: index)
}

আমি একাধিক বস্তু মুছে ফেলতে চাইলে এই কাজ করবে? লাইক (যেখানে: {$ 0 == "বিটা" || $ 0 == "গামা"})
ইরশাদ মোহাম্মদ

16

আর একটি দুর্দান্ত এবং দরকারী সমাধান হ'ল এই ধরণের এক্সটেনশন তৈরি করা:

extension Array where Element: Equatable {

    @discardableResult mutating func remove(object: Element) -> Bool {
        if let index = index(of: object) {
            self.remove(at: index)
            return true
        }
        return false
    }

    @discardableResult mutating func remove(where predicate: (Array.Iterator.Element) -> Bool) -> Bool {
        if let index = self.index(where: { (element) -> Bool in
            return predicate(element)
        }) {
            self.remove(at: index)
            return true
        }
        return false
    }

}

এইভাবে, যদি আপনার পছন্দসই বস্তুগুলির সাথে অ্যারে থাকে:

let obj1 = MyObject(id: 1)
let obj2 = MyObject(id: 2)
var array: [MyObject] = [obj1, obj2]

array.remove(where: { (obj) -> Bool in
    return obj.id == 1
})
// OR
array.remove(object: obj2) 

4
এটি কেবল তখনই কাজ করে যদি অ্যারেতে একাধিক ঘটনা উপস্থিত না থাকে। সঠিক উত্তরটি কোনও ফিল্টার ব্যবহার করছে বা কিছুক্ষণের মধ্যে এই উত্তরটি চালাচ্ছে। এই এক্সটেনশনের একজন ব্যবহারকারী হিসাবে, আমি আশা করি এটি সমস্ত ঘটনাকে সরিয়ে ফেলবে এবং কেবল একটি নয়
জুনচাজাল্লা

এটি দুর্দান্ত, তবে এটি হওয়া উচিত remove(element: Element)কারণ অ্যারেতে আপনি ইন্ট, ডাবল জাতীয় প্রকারেরও সঞ্চয় করতে পারেন - এগুলি বস্তু নয়।
রাদেক উইলকজাক

8

ইন সুইফট 5 , এটি ব্যবহার করুন Extension:

extension Array where Element: Equatable{
    mutating func remove (element: Element) {
        if let i = self.firstIndex(of: element) {
            self.remove(at: i)
        }
    }
}

উদাহরণ:

var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")

ইন সুইফট 3 , এটি ব্যবহার করুন Extension:

extension Array where Element: Equatable{
    mutating func remove (element: Element) {
        if let i = self.index(of: element) {
            self.remove(at: i)
        }
    }
}

উদাহরণ:

var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")

6
  1. for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) সি-স্টাইলে লুপের জন্য এবং সরানো হয়েছে

  2. যদি আপনার কোডটি লুপ হয়ে থাকে তবে সমস্ত অনুরূপ বস্তুটি সরিয়ে দিতে এই জাতীয় কিছুতে এটি পরিবর্তন করুন:

    let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset }
    for index in indexes.reversed() {
       arrContacts.remove(at: index)
    }
    

গণিত -> ফিল্টার -> মানচিত্র এবং অপসারণ (এ) হ'ল স্মার্ট সমাধান।
রায়ান এক্স

4

সুইফট 4

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]

if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
   students.remove(at: index)
}

3

সুইফট 3-এ এই বস্তুর একটি অ্যারে ("অ্যারে" নাম দেওয়া হয়েছে) থেকে একটি অনন্য বস্তু (নাম দেওয়া হয়েছে "অবজেক্টটোরিমোভ") মুছে ফেলার জন্য সঠিক এবং কার্যকারী এক-লাইন সমাধানটি হ'ল:

if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
   array.remove(at: index)
}

1

সুইফ্ট 3 এ এটি ব্যবহার করে দেখুন

array.remove(at: Index)

পরিবর্তে

array.removeAtIndex(index)

হালনাগাদ

"Declaration is only valid at file scope".

নিশ্চিত করুন যে বস্তুটি সুযোগে আছে। আপনি স্কোপ "ইন্টার্নাল" দিতে পারেন, এটি ডিফল্ট।

index(of:<Object>) কাজ করার জন্য, ক্লাসের সাথে সামঞ্জস্য করা উচিত Equatable


1

ইন সুইফট 3 এবং 4

var array = ["a", "b", "c", "d", "e", "f"]

for (index, element) in array.enumerated().reversed() {
    array.remove(at: index)
}

সুইফট ৪.২ থেকে আপনি আরও উন্নত পদ্ধতি ব্যবহার করতে পারেন (দ্রুত এবং মেমরি দক্ষ)

array.removeAll(where: { $0 == "c" })

পরিবর্তে

array = array.filter { !$0.hasPrefix("c") }

এখানে আরও পড়ুন


1

অ্যারে এটি সহজেই করতে এক্সটেনশান এবং সুইফট ৪.২ এবং তারপরে চেইনের অনুমতি দেয়:

public extension Array where Element: Equatable {
    @discardableResult
    public mutating func remove(_ item: Element) -> Array {
        if let index = firstIndex(where: { item == $0 }) {
            remove(at: index)
        }
        return self
    }

    @discardableResult
    public mutating func removeAll(_ item: Element) -> Array {
        removeAll(where: { item == $0 })
        return self
    }
}

আর্গুমেন্ট লেবেল '(যেখানে :)' কোনও উপলভ্য ওভারলোডের সাথে মেলে না
jeet.chanchawat

4
@ জীট.চাঁচাওয়াত সম্ভবত ভাল ভিন্ন ভিন্ন সুইফ্ট সংস্করণ তখন ... ওহ এই প্রশ্নটি কি 3 এর জন্য ছিল? ঠিক আছে আমার মনে হয় লেখার সময় আমার কাছে 4.2 ছিল তবে এখন মনে নেই, এটি পরে পরীক্ষা করে দেখবে, এটি অবশ্যই আমার জন্য কাজ করেছে
রিনিটিক

0

এটি নির্দিষ্ট অবজেক্টের সূচি খুঁজে পাওয়ার জন্য সরকারী উত্তর, তারপরে আপনি সহজেই সেই সূচকটি ব্যবহার করে যে কোনও বস্তু সরিয়ে ফেলতে পারেন:

var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") {
     // students[i] = "Max"
     students.remove(at: i)
}
print(students)
// Prints ["Ben", "Ivy", "Jordell"]

লিঙ্কটি এখানে: https://developer.apple.com/docamentation/swift/array/2994720-findindex


0

এটি আমি ব্যবহার করেছি (সুইফট 5) ...

    extension Array where Element:Equatable
    {
        @discardableResult
        mutating func removeFirst(_ item:Any ) -> Any? {
            for index in 0..<self.count {
                if(item as? Element == self[index]) {
                    return self.remove(at: index)
                }
            }
            return nil
        }
        @discardableResult
        mutating func removeLast(_ item:Any ) -> Any? {
            var index = self.count-1
            while index >= 0 {
                if(item as? Element == self[index]) {
                    return self.remove(at: index)
                }
                index -= 1
            }
            return nil
        }
    }

    var arrContacts:[String] = ["A","B","D","C","B","D"]
    var contacts: [Any] = ["B","D"]
    print(arrContacts)
    var index = 1
    arrContacts.removeFirst(contacts[index])
    print(arrContacts)
    index = 0
    arrContacts.removeLast(contacts[index])
    print(arrContacts)

ফলাফল:

   ["A", "B", "D", "C", "B", "D"]
   ["A", "B", "C", "B", "D"]
   ["A", "B", "C", "D"]

গুরুত্বপূর্ণ: আপনি যে অ্যারে থেকে আইটেমগুলি সরিয়েছেন তাতে অবশ্যই সমতুল্য উপাদান থাকতে হবে (যেমন বস্তু, স্ট্রিং, সংখ্যা ইত্যাদি)

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