Ios Swift上的数组比较未按预期工作
我收到一封班级Ios Swift上的数组比较未按预期工作,ios,arrays,swift,comparison,Ios,Arrays,Swift,Comparison,我收到一封班级电子邮件: import SwiftyJSON class Email: NSObject { required init?(JSON jsonObject: AnyObject) { let emailJsonObject = JSON(jsonObject) self.email = emailJsonObject["emailaddress"].stringValue self.emailType = emailJ
电子邮件
:
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
}
现在如果我有两个数组
:
let newEmails = emailsJsonObjects.map({ return Email(JSON: $0)! }).sort({ $0.0.email < $0.1.email })
let currentEmails = (self.emails as! [Email]).sort({ $0.0.email < $0.1.email })
我错过什么了吗?比较是否不同 问题在于,由于对象继承自
NSObject
,因此数组正在使用isEqual()
对数组元素进行比较。将以下重写添加到类定义中
override func isEqual(object: AnyObject?) -> Bool
{
if let rhs = object as? Email
{
return self.email == rhs.email && self.emailType == rhs.emailType
}
return false
}
这一切都应该很好。
newEmails==currentmails
询问这两个数组是否是相同的数组,而它们可能不是newEmails[0]==currentEmails[0]
询问newEmails
中索引0处的电子邮件是否与currentEmails
中索引0处的电子邮件相同。Paulw11:我也这么认为,但根据这个(),它实际上贯穿了所有数组元素。我在一个操场上做了一些测试,它确实如预期的那样工作,但在这种情况下不起作用。也许它只是调试器。当你真正运行代码时(即,不在调试器中),它工作正常(返回true
)还是失败(返回false
)?所以基本上,如果Email
类不需要是NSObject
的子类,则应遵循equalable
协议。因此,让Swift类遵循NSObject
协议会带来可能的副作用。有趣。感谢info@JeremyP.interest:因此=
函数在运行时没有映射到isEqual:
。我不知道。我想知道这是否与reference
类型与value
类型有关。从某种意义上说,谢谢你的信息。默认的isEqual
比较引用,如果不重写它,就会发生这种情况。就是这样!哇,太奇怪了。正如@robotcat所提到的,创建Swift类子类NSObject
会带来副作用。有趣。谢谢你的帮助@dccarmo如果您仔细想想,在Objective-C中,覆盖isEqual:
将是显而易见的。这里有点模糊,因为正在进行的隐式铸造。
override func isEqual(object: AnyObject?) -> Bool
{
if let rhs = object as? Email
{
return self.email == rhs.email && self.emailType == rhs.emailType
}
return false
}