在协议类型数组上使用find()

时间:2014-07-01 14:20:05

标签: arrays swift

每当我创建一个协议类型数组时,我如何获得该数组中对象的索引?我尝试过以下方法:

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?

有没有人能够了解我做错了什么,或者这种情况是否可能?感谢。

2 个答案:

答案 0 :(得分:2)

如果find()期望其第一个参数的元素为Equatable且第二个参数也为Equatable,则在非Equatable数组上调用find() aProtocol个元素不会编译。

要修复,请更改为

protocol aProtocol : Equatable { ... }

然后为Equatable定义实施aClass协议。

答案 1 :(得分:0)

[我现在不在Mac前面,所以我无法验证这个建议。]

重载==函数,但不要将aClass标记为符合Equatable协议。

https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/Equatable.html