每当我创建一个协议类型数组时,我如何获得该数组中对象的索引?我尝试过以下方法:
protocol aProtocol {
func doSomething()
}
class aClass: aProtocol, Equatable {
var aProperty = "test"
func doSomething() {
}
}
func == (lhs: aClass, rhs: aClass) -> Bool {
return lhs.aProperty == rhs.aProperty
}
var testArray = aProtocol[]()
let testObject = aClass()
testArray += testObject
find(testArray, testObject)
在这种情况下,我得到一个"无法转换表达式' $ T4?'输入' aClass'"错误。
查看find()方法签名,我们发现该元素应该实现Equatable(这就是为什么我重载上面的==运算符):
func find<C : Collection where C.GeneratorType.Element : Equatable>(domain: C, value: C.GeneratorType.Element) -> C.IndexType?
有没有人能够了解我做错了什么,或者这种情况是否可能?感谢。
答案 0 :(得分:2)
如果find()
期望其第一个参数的元素为Equatable
且第二个参数也为Equatable
,则在非Equatable数组上调用find()
aProtocol
个元素不会编译。
要修复,请更改为
protocol aProtocol : Equatable { ... }
然后为Equatable
定义实施aClass
协议。
答案 1 :(得分:0)
[我现在不在Mac前面,所以我无法验证这个建议。]
重载==函数,但不要将aClass标记为符合Equatable协议。