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