You will need to change %@
for %i
and remove the extra parenthesis:
Main problem here is that you are putting an Int
where it's expecting an String
.
Here's an example based on this 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
Another workaround would be to make thisSection
's value an String
, this can be achieved by String Interpolation or via description
property of the Int
.. lets say:
Changing:
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
for
let thisPredicate = NSPredicate(format: "age == %@", thisSection.description)
or
let thisPredicate = NSPredicate(format: "age == %@", "(thisSection)")
of course, you can always bypass this step and go for something more hardcoded (but also correct) as:
let thisPredicate = NSPredicate(format: "sectionNumber == (thisSection)")
But take into account that for some weird reason
String Interpolation (this kind of structure: "(thisSection)"
) where leading to retain cycles as stated here
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…