我正在努力寻找一种更好的方法来测试平等。我不喜欢的是profileImage的部分。
有没有更好的方式来写它?
class CustomObject : NSObject , NSCoding {
var pattern : String
var name : String
var id : String
var profilePicture : NSImage?
override func isEqual(object: AnyObject?) -> Bool {
if let other = object as? CustomObject {
if (id == other.id &&
name == other.name &&
pattern == other.pattern) {
if (profilePicture == nil && other.profilePicture == nil) {
return true
} else {
return profilePicture!.isEqual(other.profilePicture)
}
}
}
return false
}
}
答案 0 :(得分:2)
如果您希望实现与您所示的几乎相同,我最好的建议是使用==
运算符。 (不是===
,不要混淆。)
==
有一个重载:(在Swift 2中)
@warn_unused_result
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
其详细行为如下:
(1)如果lhs == nil&amp;&amp; rhs == nil,return true
(2)如果lhs == nil&amp;&amp; rhs!= nil,return false
(3)如果lhs!= nil&amp;&amp; rhs == nil,return false
(4)如果lhs!= nil&amp;&amp; rhs!= nil,return(lhs!== rhs!)
对于#4,两个NSObject参数的非==
运算符的非可选版本,只需在内部调用isEqual:
方法。
所以,CustomObject.isEqual(_:)
可以写成这样的东西:
override func isEqual(object: AnyObject?) -> Bool {
if let other = object as? CustomObject {
return id == other.id &&
name == other.name &&
pattern == other.pattern &&
profilePicture == other.profilePicture
}
return false
}
(假设您的NSImage.isEqual(_:)
按预期工作。)
顺便说一下,原始代码可能会在某种情况下崩溃。
if (profilePicture == nil && other.profilePicture == nil) {
return true
} else {
return profilePicture!.isEqual(other.profilePicture)
}
当profilePicture == nil&amp;&amp; other.profilePicture!= nil,控件进入else
部分,profilePicture!
将崩溃。