出于值类型与引用类型的明显优势,我在我的iOS应用中使用结构体来存储数据,但是我正在尝试弄清楚如何设计相似内容的组。用户发布可能包括图像、文本和/或标题。如果我使用类,我会使用一个通用的Post
超类,具有不同的子类代表不同类型的帖子。这样我可以传递Post
数据并根据需要进行转换。然而,结构体不允许继承,那么我该如何设计类似的东西呢?
出于值类型与引用类型的明显优势,我在我的iOS应用中使用结构体来存储数据,但是我正在尝试弄清楚如何设计相似内容的组。用户发布可能包括图像、文本和/或标题。如果我使用类,我会使用一个通用的Post
超类,具有不同的子类代表不同类型的帖子。这样我可以传递Post
数据并根据需要进行转换。然而,结构体不允许继承,那么我该如何设计类似的东西呢?
使用Swift中的结构体,您可以为常见任务创建协议
,并使用协议扩展实现默认实现。
protocol Vehicle {
var model: String { get set }
var color: String { get set }
}
//Common Implementation using protocol extension
extension Vehicle {
static func parseVehicleFields(jsonDict: [String:Any]) -> (String, String) {
let model = jsonDict["model"] as! String
let color = jsonDict["color"] as! String
return (model, color)
}
}
struct Car : Vehicle {
var model:String
var color:String
let horsepower: Double
let license_plate: String
init(jsonDict: [String:Any]) {
(model, color) = Car.parseVehicleFields(jsonDict: jsonDict)
horsepower = jsonDict["horsepower"] as! Double
license_plate = jsonDict["license_plate"] as! String
}
}
struct Bicycle : Vehicle {
var model:String
var color:String
let chainrings: Int
let sprockets: Int
init(jsonDict: [String:Any]) {
(model, color) = Bicycle.parseVehicleFields(jsonDict: jsonDict)
chainrings = jsonDict["chainrings"] as! Int
sprockets = jsonDict["sprockets"] as! Int
}
}