2016-12-05 143 views
1

我想弄清楚如何使用在另一个协议内部具有自我或相关类型需求的协议。请看下面的例子:在另一个通用协议类型中使用通用协议类型

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一个参考,我只能把它作为一个通用的约束。我不知道的是,如果有什么Swift魔法可以让我试图达到目标?

最后,我想用协议为例说明如下:

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 { 
     ... 
    } 
} 

而如果它的事项,我用斯威夫特3.

感谢提前的帮助。

回答

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 
    } 
} 
+0

谢谢,就是这样。 – RPK

相关问题