web-dev-qa-db-ja.com

SwiftでNSPredicateを使用して日付をクエリできません

特定の日付より後の日付を取得しようとしています。私の述語は次のとおりです。

NSPredicate(format: "date > \(currentDate)")

フェッチリクエストを実行すると、例外をキャッチしました。

'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"'

そのようなクエリを作成できると思った。私は何を間違えていますか?

25
Marcone

NSPredicate(format:_:)はフォーマット文字列と引数のリストを取りますが、単純な文字列を渡します。このイニシャライザはパラメータでstringWithFormat:を呼び出すだけでなく、述語を構築しているときに実際に引数の型情報を調べるため、これは機能しません。

引数として日付を渡すことにより、その初期化子を使用できます。

let datePredicate = NSPredicate(format: "date > %@", currentDate)
22
Nate Cook

Swift 3では、述部が次のように変更されました。

let datePredicate = NSPredicate(format: "date > %@", currentDate as NSDate)
54
Nik Yekimov

Swift 3、必要に応じて、問題を解決するために次の5つのパターンのいずれかを選択できます。


#1。 NSPredicateを使用する init(format:​arguments:​)NSDateインスタンスで初期化子

NSPredicateには、次の宣言を持つinit(format:​arguments:​)という初期化子があります。

_init(format predicateFormat: String, arguments argList: CVaListPointer)
_

引数リストの値をフォーマット文字列に置き換えて結果を解析することにより、新しい述語を作成して返します。

NSDateと共に使用する場合、以下に示すようにinit(format:​arguments:​)を使用してNSPredicateのインスタンスを設定できます。

_let date = NSDate()
let predicate = NSPredicate(format: "date > %@", date)
_

#2。 NSPredicateを使用する init(format:argumentArray:)NSDateインスタンスで初期化子

NSPredicateには、次の宣言を持つinit(format:argumentArray:)という初期化子があります。

_init(format predicateFormat: String, argumentArray arguments: [Any]?)
_

指定された配列の値をフォーマット文字列に代入して結果を解析することにより、新しい述語を作成して返します。

NSDateと共に使用する場合、以下に示すようにinit(format:​argumentArray:​)を使用してNSPredicateのインスタンスを設定できます。

_let date = NSDate()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
_

#3。 NSPredicateinit(format:​arguments:​)DateインスタンスをNSDateにキャストした初期化子の使用

Dateとともに使用する場合、以下に示すようにNSPredicateインスタンスをDateにキャストすることにより、NSDateのインスタンスを設定できます。

_let date = Date()
let predicate = NSPredicate(format: "date > %@", date as NSDate)
_

#4。 NSPredicateinit(format:​arguments:​)DateインスタンスをCVarArgにキャストした初期化子の使用

Dateとともに使用する場合、以下に示すようにNSPredicateインスタンスをDateにキャストすることにより、CVarArgのインスタンスを設定できます。

_let date = Date()
let predicate = NSPredicate(format: "date > %@", date as CVarArg)
_

#5。 NSPredicateを使用する init(format:argumentArray:)Dateインスタンスで初期化子

Dateと共に使用する場合、以下に示すようにinit(format:argumentArray:)を使用してNSPredicateのインスタンスを設定できます。

_let date = Date()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
_
23
Imanou Petit