2016-12-05 122 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