2015-08-07 2 views
11

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

Я получаю сообщение об ошибке EXC-BAD-ACCESS это заявление:

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

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

thisPredicate = (_ContiguousArrayStorage ...) 

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

+0

У вас есть дополнительная открывающая скобка, которые не должно быть там –

+0

я не знаю, почему он показывает дополнительную скобку выше, потому что это не то, что у меня есть: var thisPredicate = NSPredicate (format: "(sectionNumber ==% @)", thisSection) – PatriciaW

+0

@PatriciaW Проблема в вашем вопросе заключалась в том, что вы пропустили скобки закрытия после ** @ ** , Кстати, я отредактировал свой предыдущий ответ, возможно, вам стоит взглянуть на некоторые соображения, которые я добавил. –

ответ

17

Вы можете попробовать String Interpolation Swift Standard Library Reference. Это будет выглядеть примерно так:

let thisSection = 1 
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)") 
+0

Большое вам спасибо.Я очень неопытен в этой области, и это фиксировало это. – PatriciaW

12

Вам нужно будет изменить %@ для %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 «s 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)") 

Но учтите, что по какой-то странной причине String Interpolation (этого вида структуры:"\(thisSection)"), где ведущий сохранить циклы, как указано here

+0

Hugo, спасибо за эти предложения. Я пробовал% @, но не знал, что использовать .description. Я пробовал% d, но не% i. – PatriciaW

+0

'.description' является свойством каждого типа данных в ** Swift **, он превращает значение' Number', 'Date' и т. Д. В представление' String'. '% i' делает это преобразование для вас. –