簡體   English   中英

問:'[String]' 類型的值沒有成員 'filtered'

[英]Q:Value of type '[String]' has no member 'filtered'

在我的代碼中,當我implementation我的funcfilterContentForSearchText(searchText:String, scope:String)

錯誤來了:

let resultPredicate:NSPredicate = NSPredicate.init(format: "name contains[c] \(searchText)", searchText)
resultDataSource = dataSource?.filtered(using: resultPredicate) as NSArray?  // the red error:Value of type '[String]' has no member 'filtered'

我在下面發布我的代碼:

import UIKit

class StoreListViewController: UIViewController, UISearchBarDelegate,UISearchDisplayDelegate,UITableViewDelegate,UITableViewDataSource {

var dataSource:[String]? = nil
var resultDataSource:NSArray? = nil

override func viewDidLoad() {
    super.viewDidLoad()
    
    initData()
    initUI()
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

// MARK: - init
func initData(){

    self.searchDisplayController?.searchResultsDelegate = self
    self.searchDisplayController?.searchResultsDataSource = self
    self.searchDisplayController?.delegate = self
    
    dataSource = ["a","a","a","a" ]
}
func initUI() -> Void {
    
    
}


// MARK: - tableView delegate

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    if tableView == self.searchDisplayController?.searchResultsTableView {
        
        return (dataSource?.count)!
    }else {
    
        return (resultDataSource?.count)!
    }
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell_id = "StoreListTabCell"
    
    var cell:StoreListTabCell = tableView.dequeueReusableCell(withIdentifier: cell_id) as! StoreListTabCell
    

    cell.title_label.text = dataSource?[indexPath.row]
    
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    tableView.deselectRow(at: indexPath, animated: true)
}

// MARK: - filter delegate
func filterContentForSearchText(searchText:String, scope:String) -> Void {
    
//        NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
//        filteredist = [OldList filteredArrayUsingPredicate:resultPredicate];
    let resultPredicate:NSPredicate = NSPredicate.init(format: "name contains[c] \(searchText)", searchText)
    resultDataSource = dataSource?.filtered(using: resultPredicate) as NSArray?  // there is the error!!!
}

func searchDisplayController(_ controller: UISearchDisplayController, shouldReloadTableForSearch searchString: String?) -> Bool {
    
    //let scope_str = searchDisplayController?.searchBar.scopeButtonTitles.objectAtIndex(self.searchDisplayController.searchBar.selectedScopeButtonIndex)
    //[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    
    var scopeTitles:Array = (searchDisplayController?.searchBar.scopeButtonTitles)!
    
    let selected_index = searchDisplayController?.searchBar.selectedScopeButtonIndex
    
    let scope_str = scopeTitles[selected_index!]
    
    
    filterContentForSearchText(searchText: searchString!, scope:scope_str)
    
    return true
}

}

在我的故事板中:

因為 Swift 數組不支持 NSArray's filterred with predicate,你必須使用array.filter{ $0.contains(searchText) } (推薦)或array.filter{resultPredicate.evaluate(with:$0)} (與 NSPredicate 一起使用 - 完全swift 不酷)而不是你正在使用的那個

完整:

array.filter { (item) -> Bool in
            resultPredicate.evaluate(with: item)
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM