2016-12-05 6 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 { 
     ... 
    } 
} 

И в случае, если это имеет значение, я использую Swift 3.

Спасибо за помощь заранее.

ответ

1

linkedTypes и generics должны быть в состоянии получить то, что вы хотите. Тем не менее, вы должны взглянуть на протоколы 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 
    } 
} 
+0

Спасибо, что сделал. – RPK