2015-06-25 17 views
6

Khi tôi lọc một mảng của các tầng lớp tùy chỉnh Swift sử dụng một Predicate tôi nhận được lỗi:Sử dụng vị từ trên mảng các đối tượng trong Swift trả Lỗi

*** NSForwarding: warning: object 0x78ed21a0 of class 'Plantivo1_6.Seed' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[Plantivo1_6.Seed valueForKey:]

Nếu tôi nhớ không lầm này sẽ làm việc trong Objective-C. Sai lầm của tôi là gì?

let names = ["Tom","Mike","Marc"] 
println(names) 
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", "om") 
let array = (names as NSArray).filteredArrayUsingPredicate(searchPredicate) 
println(array) 
println() 

let mySeed1 = Seed() // Seed is a class with a `culture` String property 
let mySeed2 = Seed() 
let mySeed3 = Seed() 
mySeed1.culture = "Tom" 
mySeed2.culture = "Mike" 
mySeed3.culture = "Marc" 

let mySeeds = [mySeed1,mySeed2,mySeed3] 
println(mySeeds) 
let searchPredicate1 = NSPredicate(format: "SELF.culture CONTAINS[c] %@", "om") 
let array1 = (mySeeds as NSArray).filteredArrayUsingPredicate(searchPredicate1) 
println(array1) 

Trả lời

12

Lớp Seed của bạn có kế thừa từ NSObject không?

Nếu không, đây là tin nhắn bạn sẽ nhận được.

Giải pháp:

class Seed: NSObject { 
    ... 

Edit: stklieme là đúng - sử dụng NSPredicate, lớp của đối tượng của bạn cần phải thực hiện -valueForKey theo quy định của NSKeyValueCoding protocol. Bạn có thể xác định việc triển khai -valueForKey của riêng bạn hoặc chỉ làm cho lớp của bạn được kế thừa từ NSObject, điều này sẽ đảm nhiệm điều đó cho bạn.

này được định nghĩa trong the Apple docs for NSPredicate,

You can use predicates with any class of object, but the class must support key-value coding for the keys you want to use in a predicate.

+1

Không, nó không ... như thế nào một nghĩa vụ phải biết rằng ... –

+1

Thực hiện một số chỉnh sửa, không có giải thích nó tốt hơn? Nó chỉ là cách mà NSPredicate làm việc nội bộ để chuyển đổi một chuỗi thành một khóa có thể được sử dụng để thu được một giá trị từ cá thể lớp. – jperl

1

valueForKey là một phương pháp mã hóa giá trị then chốt. Khai báo Seed lớp như một lớp con của NSObject mà phù hợp với KVC

+1

Bạn cần KVC cho cú pháp vị ngữ này, nhưng bạn không cần KVO. KVO đặt các yêu cầu bổ sung cho một lớp học không liên quan ở đây. – Rob

0

đơn giản,

Bạn cần phải kế thừa lớp mô hình của bạn bằng cách NSObject và vấn đề của bạn được cố định.

class Seed: NSObject { 
    ... 
} 

Lý do: -valueForKey theo quy định của Nghị định thư NSKeyValueCoding. Bạn có thể xác định thực hiện của riêng bạn -valueForKey, hoặc chỉ làm cho kế thừa lớp học của bạn từ NSObject

1

Trong trường hợp nếu bạn không muốn kế thừa từ NSObject, bạn có thể thực hiện value(forKey key: String) -> Any? phương pháp của mình:

extension Model { 
    @objc func value(forKey key: String) -> Any? { 
     switch key { 
     case "id": 
      return id 
     // Other fields 
     default: 
      return nil 
     } 
    } 
} 

Lưu ý tiền tố @objc của phương thức: điều quan trọng là vì nó cho phép NSPredicate thấy rằng phương thức được triển khai. Bạn vẫn sẽ nhận được sự cố does not implement methodSignatureForSelector: mà không có sự cố.

Hoặc, thậm chí tốt hơn, làm cho đối tượng của bạn để phù hợp với giao thức này:

@objc protocol UsableInPredicate { 
    @objc func value(forKey key: String) -> Any? 
} 
Các vấn đề liên quan