如何使用indexOf并依赖CollectionType协议

时间:2015-07-31 15:07:59

标签: swift

为了好玩,我试图编写一个协议扩展函数,让我向Array请求我传入的元素的下一个元素。它将是循环的,如果我传入最后一个元素,它将返回第0项。我首先尝试将我的方法放在Array扩展上,但是我遇到了问题所以我尝试在CollectionType协议上进行。我有类似的东西:

extension CollectionType where Self.Generator.Element : Equatable {
final func elementAfter(element : Self.Generator.Element ) -> Self.Generator.Element? {
    let count = self.count
    if count == 0 {
        return nil
    }
    guard let index = self.indexOf(element) else {
        return nil
    }
    if index == (count - 1) {
        return self[0]
    }
    return self[index + 1]
}
}

当我尝试将索引与计数进行比较时,会出现问题。它说:Binary operator '==' cannot be applied to operands of type 'Self.Index' and '(Self.Index.Distance)'

有人可以帮助解释为什么索引和计数都不是简单的Int?我怎么比较这两个?

由于

1 个答案:

答案 0 :(得分:3)

涉及的三种类型对于通用类型并不相同 CollectionType

  • count返回Self.Index.Distance
  • indexOf返回(可选)Self.Index
  • 1count - 1中的常量index + 1Int

您可以做的是在索引上使用successor()方法:

func elementAfter(element : Self.Generator.Element) -> Self.Generator.Element? {
    guard let index = self.indexOf(element) else {
        return nil
    }
    if index.successor() == endIndex {
        return self.first
    }
    return self[index.successor()]
}

请注意,不需要检查空集合,因为 indexOf(element)在这种情况下失败。