为了在大多数静态的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中甚至有可能吗?
答案 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
这意味着扩展名仅适用于符合StaticSection
和Equatable
的类型,而这是
: Equatable
将使StaticSection
继承自Equatable
,而您在Swift中无法做到这一点。