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

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

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?

有没有人知道我做错了什么,或者这种情况是否可能?谢谢.

最佳答案 如果find()期望其第一个参数具有Equatable元素,并且其第二个参数也是Equatable,则在非Equatable aProtocol元素数组上调用find()将无法编译.

要修复,请更改为

protocol aProtocol : Equatable { ... }

然后为您的aClass定义实现Equatable协议.

点赞