apple - SWIFT: ¿Cómo creo un predicado con un valor Int?
apple documentation (2)
Espero que nadie me diga RTFM porque he estado luchando con esto durante algún tiempo aquí y en el desarrollador de Apple y he estado haciendo muchas búsquedas.
Recibo un error EXC-BAD-ACCESS en esta declaración:
var thisPredicate = NSPredicate(format: "(sectionNumber == %@"), thisSection)
thisSection tiene un valor de Int de 1 y muestra el valor 1 cuando me coloco sobre él. Pero en el área de depuración veo esto:
thisPredicate = (_ContiguousArrayStorage ...)
Otro predicado que usa una cadena se muestra como ObjectiveC.NSObject ¿Por qué sucede esto?
Deberá cambiar %@
por %i
y eliminar el paréntesis adicional:
El principal problema aquí es que estás poniendo un Int
donde está esperando un String
.
Aquí hay un ejemplo basado en esta post :
class Person: NSObject {
let firstName: String
let lastName: String
let age: Int
init(firstName: String, lastName: String, age: Int) {
self.firstName = firstName
self.lastName = lastName
self.age = age
}
override var description: String {
return "/(firstName) /(lastName)"
}
}
let alice = Person(firstName: "Alice", lastName: "Smith", age: 24)
let bob = Person(firstName: "Bob", lastName: "Jones", age: 27)
let charlie = Person(firstName: "Charlie", lastName: "Smith", age: 33)
let quentin = Person(firstName: "Quentin", lastName: "Alberts", age: 31)
let people = [alice, bob, charlie, quentin]
let thisSection = 33
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
let _people = (people as NSArray).filteredArrayUsingPredicate(thisPredicate)
_people
Otra solución sería hacer que el valor de esta thisSection
sea una String
, esto puede lograrse mediante Interpolación de Cadenas o mediante la propiedad de description
del Int
.. digamos:
Cambiando:
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
para
let thisPredicate = NSPredicate(format: "age == %@", thisSection.description)
o
let thisPredicate = NSPredicate(format: "age == %@", "/(thisSection)")
por supuesto, siempre puede omitir este paso e ir por algo más codificado (pero también correcto) como:
let thisPredicate = NSPredicate(format: "sectionNumber == /(thisSection)")
Pero tenga en cuenta que, por alguna extraña razón, la interpolación de cadenas ( este tipo de estructura:
"/(thisSection)"
) lleva a retener los ciclos como se indica here
Puedes probar String Interpolation Swift Standard Library Reference . Eso se vería algo así:
let thisSection = 1
let thisPredicate = NSPredicate(format: "sectionNumber == /(thisSection)")