Предыдущий / следующий объект на основе строки поиска в Swift - PullRequest
0 голосов
/ 19 ноября 2018

Я получил следующий код из другого ответа, но хотел немного изменить, чтобы включить строку для поиска. Я получаю ошибку в следующем where: { $0.id == searchString }, который говорит Ambiguous reference to member '=='. Я предполагаю, что это связано с неоднозначным характером item, но я могу ошибаться. Как я могу исправить функцию?

Получить следующий или предыдущий элемент для объекта в коллекции или массиве Swift

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

1 Ответ

0 голосов
/ 19 ноября 2018

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