为了好玩,我试图编写一个协议扩展函数,让我向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?我怎么比较这两个?
由于
答案 0 :(得分:3)
涉及的三种类型对于通用类型并不相同
CollectionType
:
count
返回Self.Index.Distance
,indexOf
返回(可选)Self.Index
,1
和count - 1
中的常量index + 1
,Int
。您可以做的是在索引上使用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)
在这种情况下失败。