ios - 快速删除对象数组中的重复元素

标签 ios swift uicollectionview

所以我的应用程序中有一个部分显示您的关注者将要参加的事件。我成功地吸引了追随者并发生了相应的事件。然后我将这些事件添加到更大的事件对象数组中。我目前在删除重复项时遇到问题 我尝试了很多扩展,但它似乎没有用。我认为这是因为数组包含具有不同内存地址的不同对象,所以当我比较它们时,无论内容是什么,它们都不相同。我已经搞砸了一段时间了,真的想不通。如果有人可以帮助我,我将不胜感激。

这是获取事件并将它们返回到我的主 VC 中的数组的方法。

static func showFollowingEvent(for followerKey: String,completion: @escaping (Event) -> Void) {
    //getting firebase root directory
    let ref = Database.database().reference()

    ref.child("users").child(followerKey).child("Attending").observeSingleEvent(of: .value, with: { (attendingSnapshot) in
        print(attendingSnapshot)
        guard var eventKeys = attendingSnapshot.children.allObjects as? [DataSnapshot] else{return}
        for event in eventKeys{
            let dispatchGroup = DispatchGroup()
            dispatchGroup.enter()
            EventService.show(forEventKey: event.key, completion: { (event) in
                dispatchGroup.leave()
                completion(event!)
            })
        }
    }) { (err) in
        print("couldn't grab event info",err)

    }
}  print("couldn't grab event info",err)

    }
}

这是接收事件并在获取事件后重新加载 collectionView 的函数。

@objc func grabFriendsEvents(){
    print("Attempting to see where your friends are going")
    UserService.following { (user) in
        for following in user {
            print(following.username as Any)
            PostService.showFollowingEvent(for: following.uid, completion: { (event) in
                self.friendsEvents.append(event)
               // self.friendsEvents.append(contentsOf: event)
                // leave here
                self.allEvents2["Friends Events"] = self.friendsEvents.removeDuplicates()
                self.collectionView?.reloadData()
            })

        }  

    }
}

我尝试了在之前的问题中看到的这些扩展,但没有任何效果。

extension Array where Element: Equatable {
    func removeDuplicates() -> [Element] {
        var result = [Element]()

        for value in self {
            if result.contains(value) == false {
                result.append(value)
            }
        }
        return result
    }

    mutating func removeDuplicatesTwo() {
        var result = [Element]()
        for value in self {
            if !result.contains(value) {
                result.append(value)
            }
        }
        self = result
    }
}


import Foundation
import FirebaseDatabase.FIRDataSnapshot

@objc(Event)
class Event:NSObject{
    var key: String?
    let currentEventName: String
    let currentEventImage: String
    let currentEventPromo: String?
    let currentEventDescription: String
    //nested properties
    let currentEventStreetAddress: String
    let currentEventCity: String
    let currentEventState: String
    let currentEventDate: String?
    let currentEventEndDate: String?
    let currentEventTime: String?
    let currentEventEndTime: String?
    let currentEventZip: Int
    var category: String
    //nested properties stop
    var currentAttendCount: Int
    var isAttending = false
    var eventDictionary: [String: Any]{


        let dateDict = ["start:date":currentEventDate, "start:time": currentEventTime,"end:time":currentEventEndTime, "end:date": currentEventEndDate]

        return ["event:name":currentEventName,"event:imageURL" : currentEventImage,
                "event:description": currentEventDescription, "attend:count": currentAttendCount,
                "event:street:address": currentEventStreetAddress,"event:zip": currentEventZip,
                "event:state": currentEventState, "event:city": currentEventCity, "event:promo": currentEventPromo ?? "", "event:date": dateDict, "event:category":category]
    }

    init(currentEventKey: String, dictionary: [String:Any]) {
        self.key = currentEventKey
        self.currentEventName = dictionary["event:name"] as? String ?? ""
        self.currentEventImage = dictionary["event:imageURL"] as? String ?? ""
        self.currentEventDescription = dictionary["event:description"] as? String ?? ""
        self.currentEventPromo = dictionary["event:promo"] as? String ?? ""
        self.currentAttendCount = dictionary["attend:count"] as? Int ?? 0
        self.category = dictionary["event:category"] as? String ?? ""
        //nested properties
        self.currentEventStreetAddress = dictionary["event:street:address"] as? String ?? ""
        self.currentEventCity = dictionary["event:city"] as? String ?? ""
        self.currentEventState = dictionary["event:state"] as? String ?? ""
        self.currentEventZip = dictionary["event:zip"] as? Int ?? 0
        let eventDate = dictionary["event:date"] as? [String: Any]
        self.currentEventDate = eventDate?["start:date"] as? String ?? ""
        self.currentEventTime = eventDate?["start:time"] as? String ?? ""
        self.currentEventEndTime = eventDate?["end:time"] as? String ?? ""
        self.currentEventEndDate = eventDate?["end:date"] as? String ?? ""


    }

    init?(snapshot: DataSnapshot) {
        guard let dict = snapshot.value as? [String : Any],
            let currentEventName = dict["event:name"] as? String,
            let currentEventImage = dict["event:imageURL"] as? String,
            let currentEventDescription = dict["event:description"] as? String,
            let currentEventPromo = dict["event:promo"] as? String,
            let category = dict["event:category"] as? String,
            let currentEventStreetAddress = dict["event:street:address"] as? String,
            let currentEventCity = dict["event:city"] as? String,
            let currentEventState = dict["event:state"] as? String,
            let currentEventZip = dict["event:zip"] as? Int,
            let currentAttendCount = dict["attend:count"] as? Int,
            let eventDate = dict["event:date"] as? [String: Any],
            let currentEventDate = eventDate["start:date"] as? String,
            let currentEventEndDate = eventDate["end:date"] as? String,
            let currentEventTime = eventDate["start:time"] as? String,
            let currentEventEndTime = eventDate["end:time"] as? String
            else { return nil }
        self.key = snapshot.key
        self.currentEventName = currentEventName
        self.currentEventImage = currentEventImage
        self.currentEventDescription = currentEventDescription
        self.currentEventStreetAddress = currentEventStreetAddress
        self.currentEventCity = currentEventCity
        self.currentEventState = currentEventState
        self.currentEventZip = currentEventZip
        self.currentAttendCount = currentAttendCount
        self.currentEventPromo = currentEventPromo
        self.currentEventDate = currentEventDate
        self.currentEventTime = currentEventTime
        self.currentEventEndTime = currentEventEndTime
        self.category = category
        self.currentEventEndDate = currentEventEndDate
    }

    static func ==(lhs: Event, rhs: Event) -> Bool {
        return lhs.key == rhs.key
    }

}

最佳答案

NSObject 类型的类将自动为 contains() 方法调用 isEqual()。您可以覆盖父类(super class)的实现以适合您的逻辑。

如果你的类必须继承 NSObject,那么使用:

class Event: NSObject {
    var key: String?

    init(key: String) {
        self.key = key
    }

    override func isEqual(_ object: Any?) -> Bool {
        guard let event = object as? Event else { return false }
        return self.key == event.key
    }
}

var event = Event(key: "abc")
var eventCopy = Event(key: "abc")

extension Array where Element:Equatable {
    func removeDuplicates() -> [Element] {
        return reduce(into: []) { result, element in
            if !result.contains(element) {
                result.append(element)
            }
        }
    }
}

var events = [event, eventCopy]
events = events.removeDuplicates()
print(events.count)

如果你的类没有继承NSObject,就让它符合Equatable协议(protocol)。

class Event: Equatable {
    var key: String?

    init(key: String) {
        self.key = key
    }

    static func ==(lhs: Event, rhs: Event) -> Bool {
        return lhs.key == rhs.key
    }
}

var event = Event(key: "abc")
var eventCopy = Event(key: "abc")

extension Array where Element:Equatable {
    func removeDuplicates() -> [Element] {
        var result = [Element]()

        for value in self {
            if result.contains(value) == false {
                result.append(value)
            }
        }

        return result
    }
}

var events = [event, eventCopy]
events = events.removeDuplicates()
print(events.count)

关于ios - 快速删除对象数组中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49660816/

相关文章:

php - 下拉刷新不刷新 JSON 数据

ios - 在没有 Storyboard/xib 的 View Controller 之间导航

ios - 为 JSON 创建数据模型 - IOS/Objective-C

android - 无法创建 flutter 项目 : No option specified for the output directory error

ios - 在 xcode 7.3 : could not build Objective-C module 'libxml2' 上运行测试

ios - 无法设置外键 SQLite.swift

ios - 如何在旋转时定义 CollectionView 的大小

ios - UITableViewCell Swift 中的动态 UICollectionViewCell

iOS - 授权访问

ios - 未在 UITableView 中加载联系人