【发布时间】:2017-07-06 03:22:34
【问题描述】:
我有一个全局定义的自定义运算符,如下所示:
func ==(lhs: Item!, rhs: Item!)->Bool {
return lhs?.dateCreated == rhs?.dateCreated
}
如果我执行这段代码:
let i1 = Item()
let i2 = Item()
let date = Date()
i1.dateCreated = date
i2.dateCreated = date
let areEqual = i1 == i2
areEqual 是假的。在这种情况下,我确定我的自定义运算符没有触发。但是,如果我将此代码添加到游乐场:
//same function
func ==(lhs: Item!, rhs: item!)->Bool {
return lhs?.dateCreated == rhs?.dateCreated
}
//same code
let i1 = Item()
let i2 = Item()
let date = Date()
i1.dateCreated = date
i2.dateCreated = date
let areEqual = i1 == i2
areEqual 是真的——我假设我的自定义操作符在这种情况下被触发了。
我没有定义其他会在非游乐场情况下导致冲突的自定义运算符,并且Item 类在两种情况下都是相同的,那么为什么我的自定义运算符没有在游乐场之外被调用?
Item 类继承自 Object class provided by Realm,后者最终继承自 NSObject。我还注意到,如果我为重载定义非可选输入,当输入是可选时,它不会被触发。
【问题讨论】:
-
i1 == i2从NSObject调用==方法,而不是你的方法。这会调用isEqual,默认情况下会比较内存地址。 -
@MartinR 所以我无法创建一个自定义运算符来执行此操作?
-
@shoe:对于
NSObject子类,您必须覆盖func isEqual(_ object: Any?) -> Bool。 stackoverflow.com/a/33320737/1187415 末尾有一个示例和文档链接。 -
@MartinR 但我注意到如果两个自定义运算符参数都不是隐式包装的可选参数,它工作得很好
-
@shoe:
NSObject符合Equatable并具有func ==(lhs: NSObject, rhs: NSObject) -> Bool功能。之所以调用它,是因为它比您的函数“更好”地匹配参数,可以在不将参数提升为可选项的情况下调用它。
标签: swift