谓词来过滤SWIFT中的字符串数组会引发错误,说NSCFString不是键值编码

时间:2014-11-13 23:47:23

标签: arrays swift nsarray nspredicate

以下是我的代码段

//Search Bar Delegate
func searchBar(searchBar: UISearchBar, textDidChange searchText: String)
{
    println(searchText)
    var predicate:NSPredicate=NSPredicate(format: "SELF CONTAINS[c] \(searchText)")!
    self.listItemToBeDisplayed=listItem.filteredArrayUsingPredicate(predicate)
    (self.view.viewWithTag(1) as UITableView).reloadData()

}

我得到的错误:

  

***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[< __ NSCFString 0x17405ef90> valueForUndefinedKey:]:这个   对于密钥V,class不符合密码值编码。

我想过滤数组中的字符串,以便我的搜索字符串进行过滤。如果我的搜索字符串包含在数组中的任何字符串中,则应该列出它。

2 个答案:

答案 0 :(得分:13)

NSPredicate(format:)强烈期望与printf样式的格式字符串一起使用(它会在插入参数时自动引用参数等)。

您正在使用Swift的字符串插值,因此已经格式化的查询作为单个字符串来到NSPredicate。这使得它不会使用参数执行任何伏都教,从而使您遇到格式错误的查询。

改为使用printf样式格式:

if let predicate = NSPredicate(format: "SELF CONTAINS %@", searchText) {
    self.listItemToBeDisplayed = (listItem as NSArray).filteredArrayUsingPredicate(predicate)
    (self.view.viewWithTag(1) as UITableView).reloadData()
}

答案 1 :(得分:0)

长时间使用谓词。这是我的结论(SWIFT)

//Customizable! (for me was just important if at least one)
request.fetchLimit = 1


//IF IS EQUAL

//1 OBJECT
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])


// IF CONTAINS

//1 OBJECT
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])