0

customObjectFirebaseのリアルタイムデータベースに保存するものがあります:

struct CustomObject: Codable {
    var id: UUID?
    var name: String?
    var status: String?
}

は、次のcustomObjectsように に格納さDictionaryUUIDますkey

Firebase 辞書のスクリーンショット

iOS アプリケーションの にデータをロードすることはできます[String: CustomObject] Dictionaryが、 を使用して を並べ替えて表示するcustomObjects方法List() ForEach(...) { がベスト プラクティスであるかどうかはわかりません。

私の現在の解決策は、がロードされたArrayときにビルドすることですDictionary

didSetデータベースが更新されるたびに使用Arrayして、で使用できるを再作成しlist()ます。

class AppManager: ObservableObject {

   @Published var customObjectArray: [CustomObject] = []

   @Published var customObjectDictionary: [String:CustomObject]? {
      didSet {
         if customObjectDictionary != nil {
            customObjectArray = []

            for (key, value) in customObjectDictionary! {
               var tempObject: CustomObject = value
               tempObject.id = UUID(uuidString: key)
               customObjectArray.append(tempObject)
            }

            customObjectArraySort()
         }
      }
   }
}

これは私のViewです:

struct MainView: View {
    @EnvironmentObject var app: AppManager
    
    var body: some View {
        List {
            ForEach(app.customObjectArray.indices, id: \.self) { index in
                HStack{
                    Text(app.customObjectArray[index].name ?? "")
                    Spacer()
                    Text(app.customObjectArray[index].status ?? "")
                }
            }
        }
    }
}

a は順序付けされていないコレクションであり、 aで aDictionaryに基づいてソートしようとするのは不適切であることを認識しています。customObject.namelistDictionary

Appleのドキュメントによると

ディクショナリは、順序が定義されていないコレクション内の同じ型のキーと同じ型の値の間の関連付けを格納します。各値は、ディクショナリ内のその値の識別子として機能する一意のキーに関連付けられています。配列内の項目とは異なり、辞書内の項目には順序が指定されていません。識別子に基づいて値を検索する必要がある場合は、実際の辞書を使用して特定の単語の定義を検索するのと同じように、辞書を使用します。

からを使用didSetして作成することは、ベスト プラクティスと見なされますか?ArrayDictionarycustomObjects

sortinglisting customObjectsからのより良いアプローチはありDictionaryますか?

4

1 に答える 1

1

ForEach を介して実行する場合は、 aDictionaryを aRandomAccessCollectionArray準拠する に変換する必要があるため、これで問題ありません。

Dictionaryに変換する をArrayデータ ソースとして持っているかどうかに関係なく.indices、特に簡単に作成できるものについては、このように使用しないでくださいIdentifiable

struct MainView: View {
    @EnvironmentObject var app: AppManager
    
    var body: some View {
        List {
            ForEach(app.customObjectArray) { object in
                HStack{
                    Text(object.name ?? "")
                    Spacer()
                    Text(object.status ?? "")
                }
            }
        }
    }
}

struct CustomObject: Codable, Identifiable {
    var id: UUID // Make this non-optional
    var name: String?
    var status: String?
}

設定した方法では、配列に要素が追加または削除されると、クラッシュが発生する可能性があります。これは、などを使用できないことを意味します.onDelete。また、.onMove適切に動作しません。

于 2022-02-09T22:11:37.263 に答える