web-dev-qa-db-fra.com

Autre approche de l'héritage pour les structures Swift?

J'utilise des structures au lieu de classes pour stocker des données dans mon application iOS en raison de l'avantage évident des types valeur/référence. Cependant, j'essaie de comprendre comment créer des groupes de contenu similaire. Les publications des utilisateurs peuvent être constituées d'images, de texte et/ou de titres. Si j'utilisais des classes, l'approche que j'utiliserais est d'avoir une superclasse Post commune avec différentes sous-classes représentant différents types de messages. De cette façon, je pouvais transmettre des données Post et les diffuser selon les besoins. Cependant, les structures ne permettent pas l'héritage, alors comment pourrais-je concevoir quelque chose de similaire?

14
A Tyshka

Dans Swift avec struct, vous pouvez créer protocol pour la tâche courante et également implémenter l'implémentation par défaut en utilisant l'extension de protocole.

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
    }
}
29
technerd