符合协议?

时间:2015-09-26 15:01:17

标签: swift2

使用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。

2 个答案:

答案 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
        }
    }
}