Код может работать, только если 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;
}
}