【发布时间】:2015-09-21 18:05:09
【问题描述】:
如果得到这个类并想根据值比较它的实例
class LocationOption: NSObject {
var name:String!
var radius:Int!
var value:String!
override func isEqual(object: AnyObject?) -> Bool {
if let otherOption = object as? LocationOption {
return (self.name == otherOption.name) &&
(self.radius == otherOption.radius) &&
(self.value == otherOption.value)
}
return false
}
}
执行时:
var a = LocationOption()
var b = LocationOption()
a.name = "test"
b.name = "test"
if a == b { // Crashes here!!
print("a and b are the same");
}
这会因“在展开可选值时意外发现 nil”而崩溃?您可以将所有这些复制到 Playground 中进行复制。
这似乎是由于Implicitly Unwrapped Optionals。如果我将所有字段声明为 Optionals,它将按预期工作。
但就我而言,我希望将这些属性设为Implicitly Unwrapped Optionals。我应该如何写 isEqual?
===
更新:@matt 是对的,因为我不想更改为“常规”选项,所以我最终得到了这个:
class LocationOption: Equatable {
var name:String!
var requireGps:Bool!
var radius:Int!
var value:String!
}
func ==(lhs: LocationOption, rhs: LocationOption) -> Bool {
let ln:String? = lhs.name as String?, rn = rhs.name as String?
let lr = lhs.radius as Int?, rr = rhs.radius as Int?
return ln == rn && lr == rr
}
【问题讨论】: