Arrays .包含不使用自定义对象

Arrays .包含不使用自定义对象,arrays,swift,Arrays,Swift,我正在使用下面的代码更新我的数组。我的要求是新数据不存在,因为我正在使用.contains方法 当我更改viewcontroller并再次访问同一页面时,此方法无法正常工作。它返回false,因此我不断得到重复的结果 这是与自定义对象相关的问题吗 if let list = rooms as? [[String : AnyObject]] { // self.roomList = [Room]() for item in list { let roomSt

我正在使用下面的代码更新我的数组。我的要求是新数据不存在,因为我正在使用.contains方法

当我更改viewcontroller并再次访问同一页面时,此方法无法正常工作。它返回
false
,因此我不断得到重复的结果

这是与自定义对象相关的问题吗

if let list  =  rooms as? [[String : AnyObject]]
{
    // self.roomList = [Room]()
    for item in list
    {
      let roomStr = json(from: item)
      let roomObj : Room = Room(JSONString: roomStr!)!
      if !self.roomList.contains(roomObj)
      {
        self.roomList.append(roomObj)
      }  
    }
    DispatchQueue.main.async {
      //First sort by name and then sort by default room..
      self.roomList.sort { $0.getRoomName()! < $1.getRoomName()! }
      self.roomList.sort { $0.getDefaultRoom()! && !$1.getDefaultRoom()! }
      self.LoadRoomsTableView.reloadData()
      self.hideActivity()
    }
}
如果出租列表=房间为?[[String:AnyObject]]
{
//self.roomList=[Room]()
对于列表中的项目
{
让roomStr=json(from:item)
让roomObj:Room=Room(JSONString:roomStr!)!
if!self.roomList.contains(roomObj)
{
self.roomList.append(roomObj)
}  
}
DispatchQueue.main.async{
//首先按名称排序,然后按默认房间排序。。
self.roomList.sort{$0.getRoomName()!<$1.getRoomName()!}
self.roomList.sort{$0.getDefaultRoom()!&&!$1.getDefaultRoom()!}
self.LoadRoomsTableView.reloadData()
self.hideActivity()
}
}

您是否知道如何解决此问题,或者对使用swift添加/更新数组中的数据的有效方法有何建议。

您必须确保您的
Room
class/struct实现协议
equalable

例如:

class Room {

    let rooms: Int
    let color: String

    init(rooms: Int, color: String) {
        self.rooms = rooms
        self.color = color
    }

}

extension Room: Equatable {
    func ==(lhs: Room, rhs: Room) -> Bool {
        return lhs.rooms == rhs.rooms &&  lhs.color == rhs.color
    }
}

如果您有
struct
和Swift>4.1+,您就不会有这个问题,因为Swift提供了
=
。感谢Vadian的提醒。

您必须确保您的
房间
类/结构实现了协议
equalable

例如:

class Room {

    let rooms: Int
    let color: String

    init(rooms: Int, color: String) {
        self.rooms = rooms
        self.color = color
    }

}

extension Room: Equatable {
    func ==(lhs: Room, rhs: Room) -> Bool {
        return lhs.rooms == rhs.rooms &&  lhs.color == rhs.color
    }
}


如果您有
struct
和Swift>4.1+,您就不会有这个问题,因为Swift提供了
=
。感谢瓦迪安的提醒。

在Swift 4.1+中,
==
函数是合成的。在
类中也是如此?我只找到了结构的示例。感谢您的快速回复,让我检查一下。您是对的,但是在一个类中,您还必须添加一个初始值设定项。这个答案也很有帮助,但是注释中@TheTiger的解决方案更适合我的情况。在Swift 4.1+中,
=
函数是合成的。同样在
类中也是如此?我只找到了structs的示例。感谢您的快速回复,让我检查一下。您是对的,但在一个类中,你还必须添加一个初始值设定项。这个答案也很有帮助,但注释中@TheTiger的解决方案对我的情况要好得多。每次你创建类的任何实例时,它都会创建新实例,并在内存中有新地址,因此它不能与你之前在数组中添加的地址相同。因此,最好是匹配对象id,而不是对象本身。你应该使用
contains where
方法。这是一个基于选项卡的应用程序,因此实例存在且我的数组不为空,问题与重复数据有关。在选中
contains
之前,你正在创建
roomObj
,因此它将与添加在
self.roomList
中的现有房间对象不匹配。因为这是不同的对象,数组包含不同的对象,尽管它们都有相同的数据,但不是相同的对象。尝试匹配我在第一条评论中建议的Id。你是对的,可能是因为这个原因,我在contains中得到了真实的答案,我已经检查了对象描述,它是不同的。您建议我使用Equatable做什么。每次创建类的任何实例时,它都会创建新实例,并在内存中有新地址,因此它不能与您以前在数组中添加的地址相同。因此,最好是匹配对象id,而不是对象本身。你应该使用
contains where
方法。这是一个基于选项卡的应用程序,因此实例存在且我的数组不为空,问题与重复数据有关。在选中
contains
之前,你正在创建
roomObj
,因此它将与添加在
self.roomList
中的现有房间对象不匹配。因为这是不同的对象,数组包含不同的对象,尽管它们都有相同的数据,但不是相同的对象。按照我在第一条评论中的建议,尝试与Id匹配。你是对的,可能是因为我在contains中得到了正确的答案,我检查了对象描述,它不同。你建议我使用Equalable做什么。