web-dev-qa-db-fra.com

Impossible d'interroger la date à l'aide de NSPredicate dans Swift

J'essaie de chercher des dates plus tard qu'une date spécifique. Mon prédicat est le suivant:

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

Lorsque j'ai exécuté la demande de récupération, j'ai détecté une exception:

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

Je pensais pouvoir faire une requête comme ça. Qu'est-ce que je fais mal?

25
Marcone

NSPredicate(format:_:) prend une chaîne de format et une liste d'arguments, mais vous passez une chaîne simple. Cela ne fonctionne pas, car cet initialiseur n'appelle pas simplement stringWithFormat: sur les paramètres, mais examine en fait les informations de type des arguments lors de la construction du prédicat.

Vous pouvez utiliser cet initialiseur en passant la date comme argument:

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

En Swift 3 le prédicat a changé en:

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

Avec Swift 3, selon vos besoins, vous pouvez choisir l'un des 5 modèles suivants afin de résoudre votre problème.


#1. Utilisation de NSPredicateinit(format:​arguments:​) initialiseur avec l'instance NSDate

NSPredicate a un initialiseur appelé init(format:​arguments:​) qui a la déclaration suivante:

init(format predicateFormat: String, arguments argList: CVaListPointer)

Crée et renvoie un nouveau prédicat en substituant les valeurs d'une liste d'arguments dans une chaîne de format et en analysant le résultat.

Lorsqu'il est utilisé avec NSDate, vous pouvez définir une instance de NSPredicate en utilisant init(format:​arguments:​) comme indiqué ci-dessous:

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

# 2. Utilisation de NSPredicateinit(format:argumentArray:) initialiseur avec l'instance NSDate

NSPredicate a un initialiseur appelé init(format:argumentArray:) qui a la déclaration suivante:

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

Crée et retourne un nouveau prédicat en substituant les valeurs d'un tableau donné dans une chaîne de format et en analysant le résultat.

Lorsqu'il est utilisé avec NSDate, vous pouvez définir une instance de NSPredicate en utilisant init(format:​argumentArray:​) comme indiqué ci-dessous:

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

# 3. Utilisation de NSPredicateinit(format:​arguments:​) initialiseur avec Date instance castée en NSDate

Lorsqu'il est utilisé avec Date, vous pouvez définir une instance de NSPredicate en transtypant votre Date instance en NSDate comme indiqué ci-dessous:

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

# 4. Utilisation de NSPredicateinit(format:​arguments:​) initialiseur avec Date instance castée en CVarArg

Lorsqu'il est utilisé avec Date, vous pouvez définir une instance de NSPredicate en transtypant votre Date instance en CVarArg comme indiqué ci-dessous:

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

# 5. Utilisation de NSPredicateinit(format:argumentArray:) initialiseur avec l'instance Date

Lorsqu'il est utilisé avec Date, vous pouvez définir une instance de NSPredicate en utilisant init(format:argumentArray:) comme indiqué ci-dessous:

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