使用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
}
但似乎没有用。
是否有更快更优雅的方法来实现对象的标准相等?
答案 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)
idxA
,idxB
和idxC
分别为0
,1
和2
。
答案 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