Swift 上的数组比较未按预期工作
Array comparison on Swift not working as expected
我有一个 class Email
:
import SwiftyJSON
class Email: NSObject {
required init?(JSON jsonObject: AnyObject) {
let emailJsonObject = JSON(jsonObject)
self.email = emailJsonObject["emailaddress"].stringValue
self.emailType = emailJsonObject["emailtype"].stringValue
}
var email: String
var emailType: String
}
func == (lhs: Email, rhs: Email) -> Bool {
return lhs.email == rhs.email && lhs.emailType == rhs.emailType
}
现在如果我有两个 Arrays
:
let newEmails = emailsJsonObjects.map({ return Email(JSON: [=12=])! }).sort({ [=12=].0.email < [=12=].1.email })
let currentEmails = (self.emails as! [Email]).sort({ [=12=].0.email < [=12=].1.email })
两者各有一个元素,而且email
和emailType
相同,我比较了一下:
(lldb) po newEmails.count
1
(lldb) po currentEmails.count
1
(lldb) po newEmails == currentEmails
false
(lldb) po newEmails[0] == currentEmails[0]
true
我错过了什么吗?比较有区别吗?
问题在于,因为您的对象继承自 NSObject
,所以数组使用 isEqual()
来比较数组元素。将以下覆盖添加到您的 class 定义
override func isEqual(object: AnyObject?) -> Bool
{
if let rhs = object as? Email
{
return self.email == rhs.email && self.emailType == rhs.emailType
}
return false
}
应该没问题。
我有一个 class Email
:
import SwiftyJSON
class Email: NSObject {
required init?(JSON jsonObject: AnyObject) {
let emailJsonObject = JSON(jsonObject)
self.email = emailJsonObject["emailaddress"].stringValue
self.emailType = emailJsonObject["emailtype"].stringValue
}
var email: String
var emailType: String
}
func == (lhs: Email, rhs: Email) -> Bool {
return lhs.email == rhs.email && lhs.emailType == rhs.emailType
}
现在如果我有两个 Arrays
:
let newEmails = emailsJsonObjects.map({ return Email(JSON: [=12=])! }).sort({ [=12=].0.email < [=12=].1.email })
let currentEmails = (self.emails as! [Email]).sort({ [=12=].0.email < [=12=].1.email })
两者各有一个元素,而且email
和emailType
相同,我比较了一下:
(lldb) po newEmails.count
1
(lldb) po currentEmails.count
1
(lldb) po newEmails == currentEmails
false
(lldb) po newEmails[0] == currentEmails[0]
true
我错过了什么吗?比较有区别吗?
问题在于,因为您的对象继承自 NSObject
,所以数组使用 isEqual()
来比较数组元素。将以下覆盖添加到您的 class 定义
override func isEqual(object: AnyObject?) -> Bool
{
if let rhs = object as? Email
{
return self.email == rhs.email && self.emailType == rhs.emailType
}
return false
}
应该没问题。