2015-09-26 4 views
1

Использование Swift 2.0 У меня есть проблема, соответствующая протоколу. Я сломал код как можно больше, чтобы проиллюстрировать проблему.Соответствует протоколу?

protocol Filter { 
    var filterName:BaseModel {get} 
} 

protocol BaseModel { 
    var name: String {get} 
} 

enum SomeModel: BaseModel { 
    case Something 
    var name: String { 
     switch self { 
     case .Something: 
      return "yeah" 
     } 
    } 
} 

struct SomeFilter:Filter { 

    var filterName:SomeModel 
} 

С помощью этого кода я получаю:

Тип 'SomeFilter' не соответствует протоколу 'Фильтр'

С SomeModel имеет тип BaseModel (соответствует BaseModel) это должно Работа. Если я изменю изменение var filterName:SomeModel на var filterName:BaseModel в SomeFilter, это работает, конечно, но я не могу понять, почему он не видит SomeModel в качестве BaseModel.

ответ

1

Это потому, что var filterName: SomeModel не является протоколом.

Вы можете попробовать что-то подобное с помощью дженериков, чтобы выполнить свою идею.

protocol Filter { 

    typealias BaseModelType 
    var filterName: BaseModelType { get } 
} 

protocol BaseModel { 

    var name: String { get } 
} 

enum Model: BaseModel { 

    case A 
    case B 

    var name: String { 

     switch self { 
     case .A: 
      return "hello world" 
     case .B: 
      return "bye world" 
     } 
    } 
} 

struct SomeFilter<T: BaseModel>: Filter { 

    typealias BaseModelType = T 
    var filterName: BaseModelType 

    init(filterName: BaseModelType) { 

     self.filterName = filterName 
    } 
} 

let test = SomeFilter(filterName: Model.A) 

test.filterName.name // prints "hello world" 

Надеюсь, это может помочь вам как-то. Любая обратная связь приветствуется.

+1

Благодарим за это! До сих пор я не знал о дженериках в Свифте. У меня получилось немного другое решение, которое было на самом деле лучше, но, по крайней мере, я кое-что узнал. – r0yalty

+0

Уверенный :) Не существует истинного единственного решения, это то, что мне нравится в программировании, решая головоломку с разными частями. – DevAndArtist

+0

@ r0yalty Если вы нашли лучшее решение, ответим на ваш вопрос и отметьте его как ответ. Так что другие программисты тоже выигрывают. – Qbyte

0

Так что в основном я понял, что мне не нужно создавать пользовательские фильтры, только пользовательские модели и в итоге что-то вроде этого.

protocol Model { 
    var name:String {get} 
} 

struct Filter { 
    var model:Model 
} 


enum SpecificModel: String, Model { 
    case Something, SomethingElse 

    var name: String { 
     switch self { 
     case .Something: 
      return "something" 
     default: 
      return rawValue 
     } 
    } 
} 
Смежные вопросы