Swift对象过滤数组

时间:2015-08-17 20:01:39

标签: ios swift nspredicate

我正在尝试过滤并返回searchDosplayController的以下对象数组。

var family = [Family]()// fetchedFamily
var filteredFamily: [Family]! // filter fetched events

这就是我过滤它的方式:

func updateSearchResultsForSearchController(searchController: UISearchController) {
        let searchText = searchController.searchBar.text

        self.filteredProvince = provinces
                if !searchText.isEmpty {
                    let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", searchText)
                    let array = (filteredProvince as NSArray).filteredArrayUsingPredicate(searchPredicate)
                    filteredProvince = array as! [Province]
}

然而,当我搜索时,没有任何东西被归还。我试着这样做:

filteredFamily = searchText.isEmpty ? family : family.filter({(dataString: String) -> Bool in
           return dataString.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil
        })

但是,我收到以下错误:' Family不是String'的子类型。有没有更好的方法来过滤家庭?因为,过滤后的结果必须发送回searchDisplayController。

提前致谢。

1 个答案:

答案 0 :(得分:1)

所以我们有一个Family类看起来像这样吗?

class Family {
    let name : String
    init(name:String) {
        self.name = name
    }
}

然后我们有一个families的列表:

var families = [Family]()

我们想要提取name属性包含给定文本的所有系列。

let searchText = "something here"

好,首先我们将此扩展名添加到String struct

extension String {
    func contains(find: String) -> Bool {
        return self.rangeOfString(find) != nil
    }
}

最后我们可以过滤家庭写作:

let filtered = families.filter { $0.name.contains(searchText) }

希望这有帮助。