gpt4 book ai didi

swift - 如何使用 indexOf 并依赖于 CollectionType 协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 06:44:37 26 4
gpt4 key购买 nike

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

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]
}
}

当我尝试将索引与计数进行比较时出现问题。它说:二元运算符“==”不能应用于“Self.Index”和“(Self.Index.Distance)”类型的操作数

有人能帮忙解释一下为什么 index 和 count 都不只是 Int 的吗?我如何比较这两者?

谢谢

最佳答案

涉及的三种类型对于泛型而言并不相同 CollectionType :

  • count返回 Self.Index.Distance ,
  • indexOf返回一个(可选)Self.Index ,
  • 常量 1count - 1index + 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)在这种情况下失败。

关于swift - 如何使用 indexOf 并依赖于 CollectionType 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31749521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com