"更好的"为选择权写平等的方法

时间:2016-08-06 06:55:28

标签: swift

我正在努力寻找一种更好的方法来测试平等。我不喜欢的是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
    }
}

1 个答案:

答案 0 :(得分:2)

如果您希望实现与您所示的几乎相同,我最好的建议是使用==运算符。 (不是===,不要混淆。)

对于具有此签名的Optionals,

==有一个重载:(在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!将崩溃。