使用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。
答案 0 :(得分: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 :(得分: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
}
}
}