web-dev-qa-db-ja.com

SWIFT 3NSArrayの述語が数値で正しく機能しない

フィルタリングに述語を使用することを学んでいます。チュートリアルを見つけましたが、Swift 3。で1つの側面が機能していません。特定のコードを次に示します。

let ageIs33Predicate01 = NSPredicate(format: "age = 33") //THIS WORKS
let ageIs33Predicate02 = NSPredicate(format: "%K = 33", "age") //THIS WORKS
let ageIs33Predicate03 = NSPredicate(format: "%K = %@", "age","33") //THIS DOESN'T WORK
let ageIs33Predicate04 = NSPredicate(format: "age = %@","33") //THIS DOESN'T WORK

4つすべてがコンパイルされますが、年齢= 33の場合でも、最後の2つは結果を生成しません。チュートリアルのテスト完全テストコードは次のとおりです。

import Foundation

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 ageIs33Predicate01 = NSPredicate(format: "age = 33")
let ageIs33Predicate02 = NSPredicate(format: "%K = 33", "age")
let ageIs33Predicate03 = NSPredicate(format: "%K = %@", "age","33")
let ageIs33Predicate04 = NSPredicate(format: "age = %@","33")

(people as NSArray).filtered(using: ageIs33Predicate01)
// ["Charlie Smith"]

(people as NSArray).filtered(using: ageIs33Predicate02)
// ["Charlie Smith"]

(people as NSArray).filtered(using: ageIs33Predicate03)
// []

(people as NSArray).filtered(using: ageIs33Predicate04)
// []

私は何が間違っているのですか?ありがとう。

6
Frederic

最後の2つが機能するのはなぜですか? Intプロパティに文字列を渡します。 Intプロパティと比較するには、Intを渡す必要があります。

最後の2つを次のように変更します。

let ageIs33Predicate03 = NSPredicate(format: "%K = %d", "age", 33)
let ageIs33Predicate04 = NSPredicate(format: "age = %d", 33)

フォーマット指定子が%@から%dに変更されていることに注意してください。

14
rmaddy