【发布时间】:2014-11-12 01:52:13
【问题描述】:
当使用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
}
但它似乎不起作用。
是否有更快、更优雅的方法来实现对象的标准相等比较?
【问题讨论】:
-
仅仅因为一个类符合 AnyObject,并不意味着它必须是 Equatable。这适用于难以单独使用 == 比较的类型,您可能希望使用自己的一组(更具体的)比较函数来进行比较。顶级代码只是意味着您在模块中看到
Item的任何地方,都可以进行比较。我个人认为这没有问题。 -
除了
find()被定义为func find<C : CollectionType where C.Generator.Element : Equatable>(domain: C, value: C.Generator.Element) -> C.Index?。请注意,它要求元素符合Equatable。您确实意识到==的任何定义都必须在全局范围内完成,因为它重载了全局运算符,这是一种常见的做法。同样,我不明白为什么这是一个问题。 Swift 不会自动知道您想如何比较Item类中的对象,并且由于 Swift 操作类型安全,如果这让您感到厌烦,也许可以考虑使用不同的语言。 -
您将自己的经历与其他人的经历混为一谈。虽然我自己也很少重载运算符,但在这种情况下和这种语言显然是必要的。如果它确实解决了您的问题,为什么还要抱怨您必须做某事?这就像抱怨您必须将函数包装在花括号中。恐怕除非您是 Apple 工程师,否则您的意见不会影响 Swift 的工作方式,您可能只需要接受这个解决方案。
-
@Teejay:“Obj-C”不是“那样”。
NSObject的实例就是这样。有区别。 -
@Teejay:“几乎所有语言都是如此。”您只是在谈论您的类子类化某些实现此功能的类的语言。在 Swift 中情况并非如此。
标签: swift