質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

6444閲覧

Realm Swiftで複数のResultsを結合したい

退会済みユーザー

退会済みユーザー

総合スコア0

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/30 00:52

###前提・実現したいこと
現在、Realm SwiftをつかってiOS用のタスクアプリを開発しています。

さまざまなのfilterの結果をまとめて一つのテーブルに表示したいのですが、
filterの条件を複雑にするのは、できれば避けたいです。

複数のResultsを結合(?)してまとめる方法があれば、
教えていただけないでしょうか。

もしかしたら、Swiftの基本的な知識かもしれませんが、
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
xcode 7.3
swift 2.2
Realm Swift 1.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

複数のResultsを結合して1つのコレクションにするよりは、複数のResultsを1つのデータソースであるかのように見せかけるとする方が、都合がいいです。

これはTableViewの使い方の問題なので、Realmだけでなく他のコレクションをデータソースに使用している場合でも同様に使えます。

例えば、下記のように3つの別々の条件でフィルタしたResultsがあるとします。

swift

1results1 = realm.objects(SomeClass.self).filter("...") 2results2 = realm.objects(SomeClass.self).filter("...") 3results3 = realm.objects(SomeClass.self).filter("...")

これを1つのテーブルで表示するには、まずテーブルの件数に3つのResultsを合計した値を返します。

swift

1func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 return results1.count + results2.count + results3.count 3}

そうすると、3つのResultsの件数ぶん、データがテーブルビューから要求されるので、results1の件数を超えたぶんはresults2へ、results2の件数を超えたぶんはresults3の要素から値を取り出して返します。

swift

1func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 2 let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 3 if indexPath.row < results1.count { 4 let data = results1[indexPath.row] 5 ... 6 } else if indexPath.row < results1.count + results2.count { 7 let data = results1[indexPath.row - results1.count] 8 ... 9 } else { 10 let data = results1[indexPath.row - results1.count - results2.count] 11 ... 12 } 13 14 return cell 15}

このようにすると、複数のコレクションを1つのコレクションであるかのように連続してテーブルビューで扱うことができます。Realm以外のデータソースでも利用できるテクニックです。

投稿2016/06/30 04:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/30 04:46

k_katsumiさん、ありがとございます。 まさに実現したいことが叶いました! さまざまな場所で使えるテクニックで、 また、いろいろ応用がききそうで、本当に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問