我尝试在我的应用程序中使用面向协议的编程作为模型层。
我开始定义两个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
或类似的。
您是否有一些提示如何实现这一目标?或者我可能试图以错误的方式解决这个问题?
答案 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
的协议定义。