没有NSObject的KVC(NSPredicate)

时间:2014-12-30 02:48:58

标签: swift nspredicate nsobject key-value-coding kvc

我正试图像这样使用NSPredicate:

let namePredicate = NSPredicate(format: "(username BEGINSWITH[c] $word)")

    if prefix == "@" {
        if countElements(word) > 0 {
            suggestionDatasource.users = (suggestionDatasource.users as NSArray).filteredArrayUsingPredicate(namePredicate!.predicateWithSubstitutionVariables(["word" : word])) as [User]
        }
    }

但是,我的User类不是NSObject的子类,因此它不符合Key Value。每当我尝试这个时,我都会得到unrecognized selector 'valueForKey'。有没有一种方法可以创建自定义类Key Value Compliant而无需继承NSObject?或者也许是一种在不使用KVC的情况下使用NSPredicate的方法。

由于

2 个答案:

答案 0 :(得分:2)

难道你不是为自己造成了不必要的困难吗?为什么不直接使用Swift为您提供的内容 - filterhasPrefix等等?我不知道用户究竟是什么,但让我们假装它是这样的:

struct User {
    let username : String = ""
}

让我们假装users是这样的:

let users = [User(username:"Matt Neuburg"), User(username:"Dudley Doright")]

那么你似乎想要做的是在Swift中琐碎

let word = "Matt"
let users2 = users.filter {$0.username.hasPrefix(word)}

答案 1 :(得分:0)

您可以手动实施value(forKey key: String) -> Any?方法:

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

注意方法的@objc前缀:这很重要,因为它允许NSPredicate看到方法已实现。