web-dev-qa-db-ja.com

Swift structs?

バリュー型と参照型の明らかな利点のため、クラスの代わりに構造体を使用してiOSアプリにデータを保存しています。しかし、私は同様のコンテンツのグループをどのように設計するかを理解しようとしています。ユーザー投稿は、画像、テキスト、および/またはタイトルで構成されます。クラスを使用している場合、使用するアプローチは、さまざまなタイプの投稿を表すさまざまなサブクラスを持つ共通のPostスーパークラスを持つことです。そうすれば、Postデータを渡し、必要に応じてキャストできます。しかし、構造体は継承を許可しないので、どのように似たようなものを設計できますか?

14
A Tyshka

Swift structを使用すると、一般的なタスク用にprotocolを作成でき、プロトコル拡張を使用してデフォルトの実装を実装することもできます。

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