2015-09-26 129 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)這應該工作。如果我在SomeFilter中將var filterName:SomeModel更改爲var filterName:BaseModel,它當然會起作用,但我無法弄清楚爲什麼它沒有將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

感謝您的支持!直到現在我還沒有真正知道Swift中的泛型。我結束了一個稍微不同的解決方案,實際上它更好,但至少我學到了一些東西。 – 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 
     } 
    } 
}