【发布时间】:2017-08-24 18:29:05
【问题描述】:
我正在实现一个模型:
- 它有结构
ClientSummary和ClientDetails -
ClientDetailsstruct 具有ClientSummarystruct 的所有属性 + 一些额外的属性 - 两个结构都有主初始化器
init(jsonDictionary: [String: Any]) -
inits的ClientSummary和ClientDetails共享大部分代码 - 有一个扩展可以使用这些结构的共享功能。
我想到的最直接的解决方案就是经典继承,但它不适用于值类型。
我正在尝试使用协议来解决这个问题,但我无法实现那些“共享初始化”。我试图将 init 的共享部分移动到协议扩展,但不能真正做到。有各种错误。
这是测试代码。
protocol Client {
var name: String { get }
var age: Int { get }
var dateOfBirth: Date { get }
init?(jsonDictionary: [String: Any])
}
struct ClientSummary: Client {
let name: String
let age: Int
let dateOfBirth: Date
init?(jsonDictionary: [String: Any]) {
guard let name = jsonDictionary["name"] as? String else {
return nil
}
self.name = name
age = 1
dateOfBirth = Date()
}
}
struct ClientDetails: Client {
let name: String
let age: Int
let dateOfBirth: Date
let visitHistory: [Date: String]?
init?(jsonDictionary: [String: Any]) {
guard let name = jsonDictionary["name"] as? String else {
return nil
}
self.name = name
age = 1
dateOfBirth = Date()
visitHistory = [Date(): "Test"]
}
}
extension Client {
// A lot of helper methods here
var stringDOB: String {
return formatter.string(from: dateOfBirth)
}
}
【问题讨论】:
-
你为什么不直接使用类呢?你需要结构的什么属性来为它牺牲继承?
-
@DávidPásztor 模型的很大一部分确实已经存在于生产环境中。结构体 vs 类是不可行的选择,因为对我们来说使用带有 vs 引用的副本来获得独立状态更有意义。
标签: swift inheritance swift-protocols