arrays - 基于 Swift 中搜索字符串的 Prev/Next 对象
问题描述
我从另一个答案中得到了以下代码,但想要稍微改变一下以包含一个可搜索的字符串。我在下面得到一个错误where: { $0.id == searchString }
,上面写着 Ambiguous reference to member '=='
。我认为这是由于模棱两可的性质,item
但我可能是错的。如何修复该功能?
extension BidirectionalCollection where Iterator.Element: Equatable {
typealias Element = Self.Iterator.Element
func after(_ item: Element, loop: Bool = false, searchString: String) -> Element? {
if let itemIndex = self.index(where: { $0.id == searchString }) {
let lastItem: Bool = (index(after:itemIndex) == endIndex)
if loop && lastItem {
return self.first
} else if lastItem {
return nil
} else {
return self[index(after:itemIndex)]
}
}
return nil
}
func before(_ item: Element, loop: Bool = false, searchString: String) -> Element? {
if let itemIndex = self.index(where: { $0.id == searchString }) {
let firstItem: Bool = (itemIndex == startIndex)
if loop && firstItem {
return self.last
} else if firstItem {
return nil
} else {
return self[index(before:itemIndex)]
}
}
return nil;
}
}
解决方案
代码只有在Iterator.Element
有id
属性的情况下才能工作,否则==
不能应用操作符。
所以添加一个协议和一个适当的约束:
protocol HasId {
var id : String { get }
}
extension BidirectionalCollection where Iterator.Element: Equatable, Iterator.Element: HasId {
typealias Element = Self.Iterator.Element
func after(loop: Bool = false, searchString: String) -> Element? {
if let itemIndex = self.index(where: { $0.id == searchString }) {
let lastItem: Bool = (index(after:itemIndex) == endIndex)
if loop && lastItem {
return self.first
} else if lastItem {
return nil
} else {
return self[index(after:itemIndex)]
}
}
return nil
}
func before(loop: Bool = false, searchString: String) -> Element? {
if let itemIndex = self.index(where: { $0.id == searchString }) {
let firstItem: Bool = (itemIndex == startIndex)
if loop && firstItem {
return self.last
} else if firstItem {
return nil
} else {
return self[index(before:itemIndex)]
}
}
return nil;
}
}
推荐阅读
- redis - TimeoutError: [Errno 110] 尝试连接 docker 中的 redis 服务时连接调用失败
- c - 关于 C 中的函数指针
- mysql - 在SQL中使用Windows函数,如何找到三科平均分最高的学生?
- wordpress - 突破 Google Form iFrame
- javascript - 如何重用 CORS 预检和资源请求之间的连接?
- c++ - 动态内存分配以使用带有参数c ++的构造函数创建对象数组
- scikit-learn - sklearn 的 transform() 和 predict() 方法有什么区别?
- arduino - 如何在类中实例化 ESP AsyncWebServer?(arduino esp8266)
- python - 在 colab 上的 tpu 上训练 lstm keras 模型我收到一个错误:无法序列化消息
- flutter - 找不到正确的提供者
在此主页小部件上方