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