【SwiftUI】RealmのList型の使い方とForEachで取り出す方法
この記事からわかること
- Realm SwiftのList型とは?
- 使い方や定義方法
- ForEachを使ったデータの取り出し方
- 配列からのキャスト(型変換)
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
iOSアプリに簡単に導入できるデータベースRealmのList型についてまとめていきたいと思います。
RealmのList型とは?
List型
はRealm Swiftライブラリを導入すると使用可能になるコレクション形式のクラスの1つです。Swiftで扱えるArray
と似たような形式であり、同じような操作方法で扱うことができます。しかしRealmではArray型は扱えないのでRealm用のコレクション型が用意されています。
public final class List<Element> : RLMSwiftCollectionBase, RealmCollectionImpl where Element : RealmCollectionValue
公式リファレンスによると「Listは1対多関係を定義するために使用されるRealmのコンテナータイプです」と記述されていました。1つのデータに対して複数の値が紐づくような構造の際に使用してねってことのようです。
格納できるデータ型はBool
、Int
、Int8
、Int16
、Int32
、Int64
、Double
、Float
、String
、Date
、Data
などです。
List型のテーブル定義
1対多となるテーブル定義での使い方を見ていきます。今回は1つのグループ(UserGroup)の中に複数のユーザー(User)が格納される場合で使用してみます。
テーブルで定義する際はRealmSwift.List<Element>
のように指定します。クラスは初期値が必要なので()
をつけて空のListを生成しています。
テーブル定義
class User: Object,ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var id: ObjectId
@Persisted var name:String = ""
@Persisted var age:Int = 0
}
class UserGroup: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var id: ObjectId
@Persisted var users = RealmSwift.List<User>()
}
実際のRealmデータ
Results<UserGroup> <0x159e046d0> (
[0] UserGroup {
id = 633428ac38f833c83b7fcb49;
users = List<User> <0x600002f60000> (
[0] User {
id = 633428ae38f833c83b7fcb4a;
name = ame;
age = 20;
},
[1] User {
id = 633428af38f833c83b7fcb4b;
name = kasa;
age = 80;
}
);
}
)
これで上記のようなデータが生成できます。id
1つに対して複数のユーザーが紐づいている形になっています。
List型はForEachで取り出せる
定義されているテーブルがObjectKeyIdentifiable
プロトコルに準拠している場合、List型はForEachやListなどで回してデータを取り出すことができます。
struct ContentView: View {
@ObservedResults(UserGroup.self) var groups
var body: some View {
if let group = groups.first{
List {
ForEach(group.users) { user in
HStack{
Text(user.name)
Text("\(user.age)")
}
}.listStyle(GroupedListStyle())
}
}
}
}
配列からのキャスト(型変換)
配列(Array
)型はRealmSwift.List
のappend(objectsIn:)
メソッドを使用することでキャストすることができます。
let array:Array<String> = ["A","B","C","D"]
let list = RealmSwift.List<String>()
list.append(objectsIn: array)
RealmSwift.Listから配列へのキャスト
RealmSwift.List
型から配列(Array
)型へはイニシャライザを使用することでキャストすることができます。以下は一度型から配列をRealmSwift.List
に変換しまた配列に戻しています。
var array:Array<String> = ["A","B","C","D"]
let list = RealmSwift.List<String>()
list.append(objectsIn: array)
array = Array(list)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。