Подтвердить что ты не робот

SWIFT: Как создать предикат со значением Int?

Я надеюсь, что никто не скажет мне RTFM, потому что я некоторое время боролся с этим и с Apple Developer, и много раз искал.

Я получаю ошибку EXC-BAD-ACCESS в этом утверждении:

var thisPredicate = NSPredicate(format: "(sectionNumber == %@"), thisSection)

thisSection имеет значение Int 1 и отображает значение 1, когда я навис над ним. Но в области отладки я вижу следующее:

thisPredicate = (_ContiguousArrayStorage ...)

Другой предикат, использующий строку, показан как ObjectiveC.NSObject Почему это происходит?

4b9b3361

Ответ 2

Вам нужно будет изменить %@ для %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)"), где приводятся к сохранению циклов, как указано здесь