在另一种通用协议类型中使用通用协议类型

时间:2016-12-05 22:19:00

标签: swift generics protocols

我试图弄清楚如何在另一个协议中使用具有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。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

associatedTypes和泛型应该能够得到你想要的。也就是说,您应该查看EquatableComparable协议。看起来你正在尝试做一些相关的事情并且采用那些可以帮助你。例如。采用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
    }
}