首页 > 解决方案 > 基于 Swift 中搜索字符串的 Prev/Next 对象

问题描述

我从另一个答案中得到了以下代码,但想要稍微改变一下以包含一个可搜索的字符串。我在下面得到一个错误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;
    }
}

标签: arraysswift

解决方案


代码只有在Iterator.Elementid属性的情况下才能工作,否则==不能应用操作符。

所以添加一个协议和一个适当的约束:

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

推荐阅读