33235


以下のようなコードを実行すると

[code]

    'Invalid predicate expressions', reason: 'Predicate expressions must compare a keypath and another keypath or a constant value'
    
[/code]

というエラーが発生します(シミュレータで確認しています)。  
`no`プロパティは`Log`エンティティの`Int`型プロパティです。

Realmのバージョンは

  * Realm (2.4.3): 
    * Realm/Headers (= 2.4.3)
  * Realm/Headers (2.4.3)
  * RealmSwift (2.4.3): 
    * Realm (= 2.4.3)

です。

[code]

    func search() {
        do {
            let realm = try Realm()
            var results = realm.objects(Log.self).filter("no == %d", 5)
            for l in results {
                print("search result is \(l.no):\(l.message)")
            }
        } catch {
            print("error occured")
        }
    }
    
[/code]

`Log`エンティティの`no`プロパティの名前を`logNo`に変えるとエラーは起きません(`nn`とか２文字にもしてみましがエラーは起きませんでした)。  
これはRealmの仕様でしょうか。それともバグでしょうか。  
ドキュメントにはそれらしい記述は見当たりませんでした。


CC BY-SA 3.0
2017-03-10T06:12:03.047
33233
2017-03-10T08:07:08.940
2017-03-10T07:54:46.907
5519
5566
question
swift ios realm
RealmSwiftで'Invalid predicate expressions'という例外について


それはRealmが利用しているiOSのクエリAPI（NSPredicate）の仕様です。

`no`（あるいは`NO`）はObjective-
Cの真偽値リテラルに使用される予約語ですので、クエリ文中で使用すると、真偽値と解釈されるので構文エラーとなってしまいます。

これを避けるにはキー値を置換するための`%K`という書き方をします。

[code]

    var results = realm.objects(Log.self).filter("%K == %d", "no", 5)
    
[/code]

上記のように`%K`を`no`で置き換える、と書くと大丈夫です。


CC BY-SA 3.0
2017-03-10T08:07:08.940
33235
2017-03-10T08:07:08.940
5519
33233
answer