30418


Realmを利用する際、`filter()`メソッドで検索条件を指定したいのですが指定した‌​い値を前の画面からセグエで受け取り、その値を‌​使いたい場合はどうしたらいいのでしょう​か。受け取ったメンバ変数を直接`filter()`に入力してもシュミレータは立ち上がるのですが、その画面に行くとエラーが出てしまいます。受け取ったメンバ変数を`filter()`に入力し、反映させるにはどうしたらいいのでしょうか。また、データは`String`型のテキストです。

### データモデル

[code]

    class ToDo: Object {
        dynamic var category = ""
        dynamic var color = ""
        dynamic var season = ""
        dynamic var brand = ""
        dynamic private var _image: UIImage? = nil
    }
    
[/code]

### 前の画面

[code]

    class tableView: UIViewController,UITableViewDataSource,UITableViewDelegate {
        @IBOutlet weak var tableView: UITableView!
    
    
        //SecondViewに渡す文字列
        var selectedText: String?
    
        let texts = ["トップス", "ジャケット・アウター", "パンツ", "スカート", "ワンピース", "バッグ", "シューズ","ファッション雑貨"]
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
    
            cell.textLabel?.text = texts[indexPath.row]
            return cell
        }
    
        func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath)
        selectedText = texts[indexPath.row]
        performSegueWithIdentifier("showSecondView",sender: nil)
    
    
        // Segueで遷移時の処理
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "showSecondView") {
                let secondVC: SecondView = (segue.destinationViewController as?SecondView)!
                secondVC.text = selectedText
            }
        }
    }
    
[/code]

### 現在の画面

[code]

    class SecondView: UIViewController, UITableViewDelegate, UITableViewDataSource {
        //tableviewからデータを受け取る
        var text:String!
    
        let toDoItems = try! Realm().objects(ToDo).filter("category == 'トップス'")
    }
    
[/code]

この時、`filter()`を手動的に'トップス'で指定すると、`category="トップス"`で登録されてるデータがずらっとSecondViewのテーブルビューに表示されるのですが、トップスと入力してる部分を前のページで押した値（ジャケット・アウター、パンツ、スカート...）を反映させたいと思っています。  
データベースも触ったばかりで、ネットを見ても情報が少ないためこのやり方が正しいのか、他に良い方法があるのか、可能か不可能かわからないことが多くて困っております。  
もちろんこの方法以外にも良い方法があればぜひ教えていただきたいです。

[code]

    try! Realm().objects(ToDo).filter("category == 受け取ったデータ")
    
[/code]


CC BY-SA 3.0
2016-11-13T03:36:53.170
30370
2016-11-15T08:05:43.313
2016-11-15T07:59:53.600
5519
19435
question
swift realm
Realmでfilterの検索条件に変数を利用するには


Realmの`filter()`メソッドは`NSPredicate`という標準の検索条件を表すAPIと互換性があるように作られています。そのため、`NSPredicate`と使い方はまったく同じです。

NSPredicateにの構文について、詳しくは下記のドキュメントをご覧ください。

<https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html>

さて、わからないことは`filter()`メソッドの検索条件に変数を指定するにはどうしたらいいか、ということだと思います。

[code]

    try! Realm().objects(ToDo).filter("category == %@", text)
    
[/code]

上記のようにして、変数で置き換える部分を`%@`で指定し、２番め以降の引数に置き換えたい変数を渡します。  
例えば、置き換えたい変数が２つ以上ある場合は、順番に`%@`が置き換えられます。

[code]

    try! Realm().objects(ToDo).filter("category == %@ && name == %@", text, name)
    
[/code]

上記は仮ですが、２つの変数を条件式で使用する例です。


CC BY-SA 3.0
2016-11-15T08:05:43.313
30418
2016-11-15T08:05:43.313
5519
30370
answer