2015-09-26 140 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 
     } 
    } 
}