ios - mega - No se puede consultar la fecha usando NSPredicate en Swift
ios 11 y swift 4:curso completo de cero a profesional mega (3)
Con Swift 3, de acuerdo con sus necesidades, puede elegir uno de los siguientes 5 patrones para resolver su problema.
# 1. Uso del init(format:arguments:)
NSPredicate
init(format:arguments:)
NSDate
con la instancia de NSDate
NSPredicate
tiene un inicializador llamado init(format:arguments:)
NSPredicate
que tiene la siguiente declaración:
init(format predicateFormat: String, arguments argList: CVaListPointer)
Crea y devuelve un nuevo predicado sustituyendo los valores de una lista de argumentos en una cadena de formato y analizando el resultado.
Cuando se usa con NSDate
, puede establecer una instancia de NSPredicate
usando init(format:arguments:)
NSPredicate
como se indica a continuación:
let date = NSDate()
let predicate = NSPredicate(format: "date > %@", date)
# 2. Usando NSPredicate
init(format:argumentArray:)
initializer con la instancia de NSDate
NSPredicate
tiene un inicializador llamado init(format:argumentArray:)
que tiene la siguiente declaración:
init(format predicateFormat: String, argumentArray arguments: [Any]?)
Crea y devuelve un nuevo predicado sustituyendo los valores de una matriz dada en una cadena de formato y analizando el resultado.
Cuando se usa con NSDate
, puede establecer una instancia de NSPredicate
usando init(format:argumentArray:)
NSPredicate
como se indica a continuación:
let date = NSDate()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
# 3. Uso del init(format:argumentArray:) NSPredicate
init(format:argumentArray:) NSDate
con la instancia de Date
NSDate
en NSDate
Cuando se utiliza con Date
, puede establecer una instancia de NSPredicate
su instancia de Date
en NSDate
como se indica a continuación:
let date = Date()
let predicate = NSPredicate(format: "date > %@", date as NSDate)
# 4. Uso del init(format:argumentArray:) NSPredicate
init(format:argumentArray:) CVarArg
con la instancia de Date
CVarArg
en CVarArg
Cuando se utiliza con Date
, puede establecer una instancia de NSPredicate
su instancia de Date
en CVarArg
como se indica a continuación:
let date = Date()
let predicate = NSPredicate(format: "date > %@", date as CVarArg)
# 5. Usando NSPredicate
init(format:argumentArray:)
initializer con la instancia de Date
Cuando se usa con Date
, puede establecer una instancia de NSPredicate
usando init(format:argumentArray:)
como se indica a continuación:
let date = Date()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
Estoy tratando de hacer una búsqueda para las fechas posteriores a una fecha específica. Mi predicado es el siguiente:
NSPredicate(format: "date > /(currentDate)")
Cuando ejecuté la solicitud de recuperación, detecté una excepción:
''Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"''
Pensé que podría hacer una consulta como esa. ¿Qué estoy haciendo mal?
En swift 3 el predicado cambió a:
let datePredicate = NSPredicate(format: "date > %@", currentDate as NSDate)
NSPredicate(format:_:)
toma una cadena de formato y una lista de argumentos, pero estás pasando una cadena simple. Esto no funciona, ya que este inicializador no solo llama a stringWithFormat:
en los parámetros, sino que en realidad mira la información de tipo de los argumentos mientras construye el predicado.
Puedes usar ese inicializador pasando la fecha como un argumento:
let datePredicate = NSPredicate(format: "date > %@", currentDate)