Swift indexOf,== 运算符覆盖未被调用
Swift indexOf, == operator override not getting called
我对 Swift 处理平等的方式感到沮丧。或者我只是错过了一些东西。为什么这 2 indexOf
的工作方式不同?
let first = self.objects.indexOf(object) //This returns nil
let second = self.objects.indexOf{[=11=] == object} //This returns the index
我的 == 覆盖:
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.someProperty == rhs.someProperty
}
第一个 indexOf 中未调用 == 覆盖。为什么?这感觉真的很危险。
(MyObject 是 PFObject(Parse.com 个对象)的子类。我不知道这是否是问题所在。)
您正在使用的第二个 indexOf
方法允许您定义一个闭包来指示对象相等(就像您已经完成的那样)。根据文档的第一个:
Returns the first index where value
appears in self
or nil
if value is not found.
其中 value
是您作为参数传递的对象。在没有看到这个版本的实现的情况下,我只能假设他们比较两个对象是否在各个方面都相等(所有属性都匹配)。因此,在您的情况下,如果您仅在 someProperty
s 匹配时才认为对象相等,那么您应该将闭包方法与重载运算符一起使用。
由于您的 Object
是 PFObject
的子类,而 PFObject
是 NSObject
的子类,并且 NSObject
已经确认 Equatable
通过使用 isEqual
方法来实现。所以你的 == 运算符覆盖不起作用。您应该覆盖 isEqual
方法。 (老实说,这太可怕了:(
示例代码:
class Object: NSObject {
var value: Int
init(value: Int) {
self.value = value
}
override func isEqual(object: AnyObject?) -> Bool {
guard let obj = object as? Object else { return false }
return self.value == obj.value
}
}
// If your class is not inherit from any ObjC class:
//extension Object: Equatable {}
//func ==(lhs: Object, rhs: Object) -> Bool {
// return lhs.value == rhs.value
//}
let c = Object(value: 3)
let objs = [Object(value: 1), Object(value: 2), Object(value: 3)]
let index = objs.indexOf(c)
let index2 = objs.indexOf { [=10=] == c }
print(index) // Optional(2)
print(index2) // Optional(2)
static func == (left: MyClass, right: MyClass) -> Bool {
return left.attribute1 == right.attribute1
}
override func isEqual(_ object: Any?) -> Bool {
guard let right = object as? MyClass else {
return false
}
// call the == from above
// why couldn't apple do this ???
//
return self == right
}
我对 Swift 处理平等的方式感到沮丧。或者我只是错过了一些东西。为什么这 2 indexOf
的工作方式不同?
let first = self.objects.indexOf(object) //This returns nil
let second = self.objects.indexOf{[=11=] == object} //This returns the index
我的 == 覆盖:
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.someProperty == rhs.someProperty
}
第一个 indexOf 中未调用 == 覆盖。为什么?这感觉真的很危险。
(MyObject 是 PFObject(Parse.com 个对象)的子类。我不知道这是否是问题所在。)
您正在使用的第二个 indexOf
方法允许您定义一个闭包来指示对象相等(就像您已经完成的那样)。根据文档的第一个:
Returns the first index where
value
appears inself
ornil
if value is not found.
其中 value
是您作为参数传递的对象。在没有看到这个版本的实现的情况下,我只能假设他们比较两个对象是否在各个方面都相等(所有属性都匹配)。因此,在您的情况下,如果您仅在 someProperty
s 匹配时才认为对象相等,那么您应该将闭包方法与重载运算符一起使用。
由于您的 Object
是 PFObject
的子类,而 PFObject
是 NSObject
的子类,并且 NSObject
已经确认 Equatable
通过使用 isEqual
方法来实现。所以你的 == 运算符覆盖不起作用。您应该覆盖 isEqual
方法。 (老实说,这太可怕了:(
示例代码:
class Object: NSObject {
var value: Int
init(value: Int) {
self.value = value
}
override func isEqual(object: AnyObject?) -> Bool {
guard let obj = object as? Object else { return false }
return self.value == obj.value
}
}
// If your class is not inherit from any ObjC class:
//extension Object: Equatable {}
//func ==(lhs: Object, rhs: Object) -> Bool {
// return lhs.value == rhs.value
//}
let c = Object(value: 3)
let objs = [Object(value: 1), Object(value: 2), Object(value: 3)]
let index = objs.indexOf(c)
let index2 = objs.indexOf { [=10=] == c }
print(index) // Optional(2)
print(index2) // Optional(2)
static func == (left: MyClass, right: MyClass) -> Bool {
return left.attribute1 == right.attribute1
}
override func isEqual(_ object: Any?) -> Bool {
guard let right = object as? MyClass else {
return false
}
// call the == from above
// why couldn't apple do this ???
//
return self == right
}