apple swift core-data xcode6

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)")