Swift结构体的替代继承方法?

40

出于值类型与引用类型的明显优势,我在我的iOS应用中使用结构体来存储数据,但是我正在尝试弄清楚如何设计相似内容的组。用户发布可能包括图像、文本和/或标题。如果我使用类,我会使用一个通用的Post超类,具有不同的子类代表不同类型的帖子。这样我可以传递Post数据并根据需要进行转换。然而,结构体不允许继承,那么我该如何设计类似的东西呢?

2个回答

86

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

10
然而,您无法通过协议扩展添加成员变量,这相当受限制。 - Ian
您可以添加静态方法(请参见代码)。示例在此处:https://repl.it/repls/BleakYouthfulConstants - Tieme
非常聪明的方法!! - Nguyen Minh Binh
但是如果我不想在y个子结构中编写车辆的x个属性呢? @technerd - Aaban Tariq Murtaza

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接