在Swift中的协议类型数组上使用index(of :)

时间:2018-08-24 09:36:13

标签: swift generics swift-protocols

为了在大多数静态的tableViews中增加灵活性,我定义了以下协议:

DataTable

我这样使用

protocol StaticSection {
    static var active: [StaticSection] { get }
    // func cell(forRowAt indexPath: IndexPath, tableView: UITableView) -> UITableViewCell
    // var numberOfRows: Int { get }
}

extension StaticSection: Equatable {
    static func at(_ index: Int) -> StaticSection {
        return active[index]
    }

    static func index(ofSection section: StaticSection) -> Int {
        return active.index(of: section) // Not working :(
    }
}

在协议的enum MySections: StaticSection { case header, footer, sectionA, sectionB static var active: [StaticSection] { // Here I can dynamically enable/disable/rearrange sections return [MySections.header, .footer] } } 实现中,我可以像这样访问段的索引:

enum

现在,我想在扩展中实现(StaticSections.active as! [MySections]).index(of: .header) ,以拥有一种更方便的方法来执行此操作。 我尝试了如上扩展中所示。但是我得到了错误:

  

无法使用类型为((of:StaticSection)''的参数列表调用'index'

在Swift中甚至有可能吗?

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

protocol StaticSection {
    static var active: [Self] { get } // note the change to Self
    // func cell(forRowAt indexPath: IndexPath, tableView: UITableView) -> UITableViewCell
    // var numberOfRows: Int { get }
}

extension StaticSection where Self : Equatable { // another change here
    static func at(_ index: Int) -> Self {
        return active[index]
    }

    static func index(ofSection section: Self) -> Int? {
        return active.index(of: section)
    }
}

enum MySections: StaticSection {
    case header, footer, sectionA, sectionB

    static var active: [MySections] { // note the change to MySections
        // Here I can dynamically enable/disable/rearrange sections
        return [.header, .footer]
    }
}

这里要注意的重要一点是这种语法:

where Self : Equatable

这意味着扩展名仅适用于符合StaticSectionEquatable的类型,而这是

: Equatable

将使StaticSection继承自Equatable,而您在Swift中无法做到这一点。