Realmをモデル/データベースとして使用してiOSアプリケーションを構築していますが、将来発生する可能性のあるREST-ful APIの変更に容易に対応できるようにクライアントを設計したいと考えています。さまざまなイベントに対応するスポーツ競技団体向けのアプリを開発しようとしています。各イベントには、どのスポーツが行われているかに基づいて、さまざまなタイプのイベントタイプがあります。現在、APIはサッカー、野球、サッカーだけを返しますが、将来はバスケットボールも含むように拡張される可能性があります。後で野球を排除するかもしれない。イベントは、このような多くの関係に一使用してイベントタイプから分離されるように、私は、レルムのオブジェクトを設計しました:REST-ful APIの変更に基づいて、MVC for iOSアプリの動的モデルを作成するにはどうすればよいですか?
class EventTypeGroup: Object {
dynamic var name = ""
let eventTypes = List<EventType>()
}
class EventType: Object {
dynamic var name = ""
dynamic var descriptionText = ""
}
アンEventTypeGroupになります(これはスポーツこの場合は)イベントの種類を記述したクラスです。イベントで演奏。このデザインは、Realmで辞書がサポートされていないため、関連する一連のプロパティでイベントタイプを格納できるため使用しました。
特定の組織のスポーツを追加または削除する場合のAPIの将来の変更に適応できるように、次のような抽象的なファクトリパターンを使用しました。このように、近代的なSwiftの設計原則に従った列挙型を使用せずにイベントを作成することはできません。私が問題を抱えているのは、ユーザーがアプリを開くとAPIのイベントタイプ(スポーツ)に対する変更を一度しかチェックしないと仮定すると、既に開いているアプリケーションでモデルを変更するにはどうすればよいですか?これらのフィールドが変更された場合、データベースを移行する必要がありますか?私は、彼らが定義されます方法がわからない場合は
protocol EventTypeGroupFactory {
func createEventTypeGroup(List<EventType>) -> EventTypeGroup
}
protocol EventTypeFactory {
func createEventTypes() -> List<EventType>
}
class SportEventGroupFactory: EventTypeGroupFactory {
func createEventTypeGroup(withEventTypes: List<EventType>) ->
EventTypeGroup {
//implement logic to create an EventTypeGroup for the SportEventGroup
}
}
class SportEventTypeFactory: EventTypeFactory {
EventTypeGroup {
func createEventType() -> EventType {
//implement logic to create an EventType for the SportEventType
}
}
class EventTypeGroup: Object {
let eventTypes = List<Int>
enum EventType {
}
}
class EventType: Object {
var type: Int?
name: String?
description: String?
}
class Event: Object {
static enum EventType
init(eventTypeWithRawValue:) {
}
}
はまた、どのように私は今、記述するコード内のクラスの異なるバリエーションを指します。抽象的なファクトリパターンはこれを処理する最善の方法ではないかもしれませんが、APIの変更に基づいてモデル内で簡単に拡張可能な型を作る問題にどのように取り組むべきかを明確にしていません。
あなたのレスポンスにEventTypeクラスのダイスを追加しませんでしたか?また、クラスではなく構造体を使用してイベントモデルを実装することを選択した特定の理由はありますか? – stonybrooklyn
Re。構造体:構造体は安全です(Swiftでは、参照ではなく値渡しされます)。また、実行時にはより速く(維持するvtableはありません)。しかし、サブクラス化が必要で、プロトコルが十分でない場合は、クラスを使用することに戻ります。 – willtherussian
Re。 EventTypeクラス:はい、他のデータをラップし、文字列(「baseball」や「football」のような値をとる文字列)を配置する必要がある場合は、eventTypeプロパティのクラスまたは構造体を使用できます。要は、列挙型ではなく文字列を使用しているということです。 – willtherussian