Swift协议中的静态类型属性

时间:2015-09-15 10:39:52

标签: swift oop model protocols

我尝试在我的应用程序中使用面向协议的编程作为模型层。

我开始定义两个protocol s:

protocol ParseConvertible {
    func toParseObject() -> PFObject?
}

protocol HealthKitInitializable {
    init?(sample: HKSample)
}

在实施符合两者的第一个模型后,我注意到另一个模型基本相似,所以我想用新的模型创建协议继承

protocol BasicModel: HealthKitInitializable, ParseConvertible {

    var value: AnyObject { get set }

}

你可以看到这个protocol还有一个额外的东西是value但我希望这个值与类型无关......现在我的模型使用Double但是谁知道将来会出现什么。如果我将此与AnyObject一起留下,我会判处我想要使用它的所有内容,如果我将其声明为Double,那么在调用此BasicModel时没有意义而是BasicDoubleModel或类似的。

您是否有一些提示如何实现这一目标?或者我可能试图以错误的方式解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可能希望定义具有“关联类型”的协议, 这与泛型类型大致相似。 来自Swift书中的"Associated Types"

  

定义协议时,声明一个或多个有时很有用   更多相关类型作为协议定义的一部分。一个   关联类型为类型提供占位符名称(或别名)   用作协议的一部分。要使用的实际类型   在采用协议之前,不指定关联类型。   关联类型使用typealias关键字指定。

在你的情况下:

protocol BasicModel: HealthKitInitializable, ParseConvertible {
    typealias ValueType
    var value: ValueType { get set }
}

然后value属性的不同类型的类可以 符合协议:

class A : BasicModel {
    var value : Int
    func toParseObject() -> PFObject? { ... }
    required init?(sample: HKSample) { ... }
}

class B : BasicModel {
    var value : Double
    func toParseObject() -> PFObject? { ... }
    required init?(sample: HKSample) { ... }
}

对于 Swift 2.2 / Xcode 7.3 以及之后,请替换中的typealias associatedtype的协议定义。