Swift中对象的默认相等运算符

时间:2014-11-12 01:52:13

标签: swift

使用find搜索数组中对象的索引时:

var index = find(Store.allItems, myItem)

编译器说Item类不符合协议Equatable。

我的Item类是一个对象,所以在我看来,来自C#,默认的相等比较器应该是引用相等。

在Swift中,您似乎需要在每个引用类型上指定Equatable才能使find生效。
此外,您需要复制==运算符,以便它使用===来比较引用:

func ==(a:Item, b:Item) -> Bool {
    return a === b
}

此外,最后一个声明必须是顶级代码,这让我感到厌恶......

我试着写:

func ==(a:AnyObject, b:AnyObject) -> Bool {
    return a === b
}

但似乎没有用。

是否有更快更优雅的方法来实现对象的标准相等?

4 个答案:

答案 0 :(得分:4)

尝试使Item类符合Equatable

extension Item:Equatable { }
func ==(lhs:Item, rhs:Item) -> Bool {
    return lhs === rhs
}

答案 1 :(得分:2)

如果您对实现自定义运算符并不感到高兴,可以实现另一个版本的find(),它可以满足您的需求:

func find<C : CollectionType where C.Generator.Element : AnyObject>(domain: C, value: C.Generator.Element) -> C.Index? {
    var index = domain.startIndex
    while index != domain.endIndex {
        if domain[index] === value {
            return index
        }
        index = index.successor()
    }
    return nil
}

答案 2 :(得分:1)

您可以使用==重载的通用函数来实现此功能;当然,你仍然需要让你的类实现Equatable协议。

实现看起来像这样:

func ==<T: AnyObject>(a: T, b: T) -> Bool {
    return a === b
}

class AClass: Equatable {}

测试出来:

let a = AClass()
let b = AClass()
let c = AClass()

let arr = [a, b, c]

let idxA = find(arr, a)
let idxB = find(arr, b)
let idxC = find(arr, c)

idxAidxBidxC分别为012

答案 3 :(得分:1)

如果你只想要参考相等,那实际上很容易。

让您的Item课程继承自NSObject

class Item: NSObject {
        var name: String

        init(name: String) {
                self.name = name
        }
}

let item1 = Item(name: "item1")
let item2 = Item(name: "item2")
let item3 = Item(name: "item3")

let items = [item1, item2, item3]

for item in items {
        if let index = find(items, item) {
                println(items[index].name)
        }
}

// Console Output:
// item1
// item2
// item3

<强>更新

  

对象比较

     

“比较两个时,有两种不同的比较类型   Swift中的对象。第一个,相等(==),比较的内容   对象。第二,身份(===),决定是否   常量或变量引用相同的对象实例。

     

Swift和Objective-C对象通常在Swift中进行比较   ==和===运算符。 Swift提供了一个默认的实现   对于派生自NSObject类的对象的==运算符。在   在执行此运算符时,Swift调用isEqual:方法   在NSObject类上定义。 NSObject类只执行一个   身份比较,所以你应该实现自己的isEqual:方法   在从NSObject类派生的类中。因为你可以通过   Swift对象(包括那些不是从NSObject派生的对象)到   Objective-C API,你应该为它们实现isEqual:方法   类,如果您希望Objective-C API比较的内容   对象而不是他们的身份。

     

作为实现课堂平等的一部分,请务必实施   根据Cocoa中Object对象中的规则的hash属性   核心竞争力。此外,如果您想将您的类用作a中的键   字典,也符合Hashable协议并实现hashValue属性。

     

摘自:Apple Inc.“将Swift与Cocoa和Objective-C结合使用。”   iBooks的。 https://itun.es/tw/1u3-0.l

相关问题