我试图弄清楚如何在另一个协议中使用具有Self或相关类型要求的协议。请考虑以下示例:
protocol SortBy {
static var values: [Self] { get }
var title: String { get }
}
protocol Filter {
var sortBy: SortBy { get set }
init(_ filter: Self)
static func == (lhs: Self, rhs: Self) -> Bool
static func != (lhs: Self, rhs: Self) -> Bool
}
我知道由于SortBy
包含对Self
的引用,因此我只能将其用作通用约束。我不知道的是,如果有任何斯威夫特魔法,我可以做些什么来容纳我想要实现的目标?
最终,我想将协议用于示例,如下所示:
enum Sort: SortBy {
case sort1
case sort2
static var values: [Sort] {
return [
.sort1,
.sort2
]
}
var title: String {
switch self {
case .sort1:
return "Sort 1"
case .sort2:
return "Sort 2"
}
}
}
struct FilterExample: Filter {
var sortBy: SortBy
init(_ filter: FilterExample) {
...
}
static func == (lhs: FilterExample, rhs: FilterExample) -> Bool {
...
}
static func != (lhs: FilterExample, rhs: FilterExample) -> Bool {
...
}
}
如果重要,我会使用Swift 3。
感谢您的帮助。
答案 0 :(得分:1)
associatedTypes和泛型应该能够得到你想要的。也就是说,您应该查看Equatable和Comparable协议。看起来你正在尝试做一些相关的事情并且采用那些可以帮助你。例如。采用Equatable意味着您只需实施==
即可免费获得!=
。
protocol SortBy {
static var values: [Self] { get }
var title: String { get }
}
protocol Filter {
associatedtype SortByType: SortBy
var sortBy: SortByType { get set }
init(_ filter: Self)
static func == (lhs: Self, rhs: Self) -> Bool
static func != (lhs: Self, rhs: Self) -> Bool
}
struct FilterExample<T: SortBy>: Filter {
var sortBy: T
init(_ filter: FilterExample<T>) {
self.sortBy = filter.sortBy
}
static func == (lhs: FilterExample, rhs: FilterExample) -> Bool {
return true
}
static func != (lhs: FilterExample, rhs: FilterExample) -> Bool {
return true
}
}