2016-12-05 9 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 
} 

私はSortBySelfへの参照が含まれているので、私は唯一の一般的な制約として、それを使用することができることを知っています。私が知りたくないことは、私が達成しようとしていることを許すためにできるスウィフトマジックがあるかどうかです。次のように

は最終的に私は、たとえばプロトコルを使用したい:

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とgenericsは、必要なものを得ることができるはずです。つまり、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

関連する問題