Ответ 1
Вы можете попробовать String Interpolation Свифт стандартной справочной библиотеки. Это будет выглядеть примерно так:
let thisSection = 1
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)")
Я надеюсь, что никто не скажет мне RTFM, потому что я некоторое время боролся с этим и с Apple Developer, и много раз искал.
Я получаю ошибку EXC-BAD-ACCESS в этом утверждении:
var thisPredicate = NSPredicate(format: "(sectionNumber == %@"), thisSection)
thisSection имеет значение Int 1 и отображает значение 1, когда я навис над ним. Но в области отладки я вижу следующее:
thisPredicate = (_ContiguousArrayStorage ...)
Другой предикат, использующий строку, показан как ObjectiveC.NSObject Почему это происходит?
Вы можете попробовать String Interpolation Свифт стандартной справочной библиотеки. Это будет выглядеть примерно так:
let thisSection = 1
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)")
Вам нужно будет изменить %@
для %i
и удалить дополнительную скобку:
Основная проблема заключается в том, что вы помещаете Int
, где ожидаете String
.
Вот пример, основанный на этом 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
Другим обходным решением было бы сделать thisSection
значение a String
, это может быть достигнуто с помощью Интерполяции строк или с помощью свойства description
Int
.. позволяет:
Изменение:
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
для
let thisPredicate = NSPredicate(format: "age == %@", thisSection.description)
или
let thisPredicate = NSPredicate(format: "age == %@", "\(thisSection)")
конечно, вы всегда можете обойти этот шаг и пойти на что-то более жесткое (но и правильно) как:
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)")
Но учтите, что по какой-то странной причине Интерполяция строк (эта структура:
"\(thisSection)"
), где приводятся к сохранению циклов, как указано здесь