2016-12-23 29 views
-1

我正在執行一個搜索欄到我的項目中,但我正在接受以下錯誤。搜索欄Swift 3 - 不能在集合中使用/包含運算符

reason: 'Can't use in/contains operator with collection wellpleased.attendees.UserData(firstname: "Ben", lastname: "Delonge", fullname: "Ben Delonge", company: "AllStar.com", jobtitle: "Business Development Manager", image: "6.jpg") (not a collection)'

我已經做了大量的NSPredicate搜索,但似乎無法防止這種崩潰。我正在使用下面的代碼,任何協助解決這個將不勝感激。

class attendees: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { 

    var tableData = "" 

    var value:String! 

    var searchString: String = "" 

    var dataSource: [UserData] = [] 
    struct UserData { 
     var firstname: String 
     var lastname: String 
     var fullname: String 
     var company: String 
     var jobtitle: String 
     var image: String 
    } 




    var filteredAppleProducts = [String]() 
    var resultSearchController = UISearchController() 

    @IBOutlet weak var tableView: UITableView! 

    @IBOutlet weak var searchBar: UISearchBar! 

    override func viewDidLoad() { 

     print(value) 



     searchBar.delegate = self 



     self.tableView.reloadData() 

     let nib = UINib(nibName: "vwTblCell2", bundle: nil) 
     tableView.register(nib, forCellReuseIdentifier: "cell2") 


    } 

    override func viewDidAppear(_ animated: Bool) { 
     getTableData() 

    } 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 


     if filteredAppleProducts != []{ 

      return self.filteredAppleProducts.count 
     } 
     else 
     { 

      if searchString != "[]" { 
      return self.dataSource.count 
      }else { 
       return 0 
      } 
     } 

    } 


    // 3 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell2: TblCell2 = self.tableView.dequeueReusableCell(withIdentifier: "cell2") as! TblCell2 

     print(filteredAppleProducts) 


     if filteredAppleProducts != []{ 

      cell2.nameLabel.text = self.filteredAppleProducts[indexPath.row] 

      return cell2 
     } 
     else 
     { 
      if searchString != "[]"{ 

       cell2.nameLabel.text = self.dataSource[indexPath.row].fullname 
       cell2.companyLabel.text = self.dataSource[indexPath.row].company 
       cell2.jobTitleLabel.text = self.dataSource[indexPath.row].jobtitle 


       let url = URL(string: "https://www.asmserver.co.uk/wellpleased/backend/profileimages/\(self.dataSource[indexPath.row].image)") 
       let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check/try-catch 
       cell2.userImage.image = UIImage(data: data!) 

      } 
      return cell2 


     } 
    } 

    // 4 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    } 

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


    func updateSearchResults(){ 


     self.filteredAppleProducts.removeAll(keepingCapacity: false) 

     let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchString) 
     let array = (self.dataSource as NSArray).filtered(using: searchPredicate) 
     self.filteredAppleProducts = array as! [String] 

     self.tableView.reloadData() 

     print(filteredAppleProducts) 


    } 


    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     print("searchText \(searchText)") 
     print(filteredAppleProducts) 

     searchString = searchText 
     updateSearchResults() 
      } 

    func getTableData(){ 

     self.dataSource.removeAll() 



     let defaults = UserDefaults() 
     let userid = defaults.string(forKey: "id") 

     let url = NSURL(string: "https://www.******.co.uk/wellpleased/backend/searchattendees.php?userid=\(userid!)&eventid=\(value!)") 

     print(url) 

     let task = URLSession.shared.dataTask(with: url as! URL) { (data, response, error) -> Void in 

      if let urlContent = data { 

       do { 

        if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 


         var i = 0 

         while i < jsonResult.count { 


          self.dataSource.append(UserData(firstname:"\(jsonResult[i]["firstname"]! as! String)", lastname: "\(jsonResult[i]["lastname"]! as! String)", fullname:"\(jsonResult[i]["fullname"]! as! String)", company: "\(jsonResult[i]["company"]! as! String)", jobtitle:"\(jsonResult[i]["jobtitle"]! as! String)", image:"\(jsonResult[i]["image"]! as! String)")) 







          i = i + 1 

         } 

        } 

       } catch { 

        print("JSON serialization failed") 

       } 

      } else { 

       print("ERROR FOUND HERE") 
      } 

      DispatchQueue.main.async(execute: {() -> Void in 


       self.tableView.reloadData() 

      }) 

      self.tableView.isUserInteractionEnabled = true 
     } 

     task.resume() 


    } 
} 

我也累了:

let searchPredicate = NSPredicate(format: "fullname CONTAINS[c] %@", searchString as String) 

返回錯誤:

this class is not key value coding-compliant for the key fullname

回答

0

NSPredicate是可可的功能,住在Objective-C的世界。它永遠不會在UserData數組上工作,因爲UserData是一個Swift結構 - 而Objective-C根本看不到Swift結構(即使它可以,當然也不會在類中看到任何類型名稱空間,因爲您的UserData是)。

如果您只是簡單地使用內置的Swift filter方法來過濾dataSource陣列,您將可以輕鬆使用該功能。例如(如果這是你想要做什麼):

let array = self.dataSource.filter{$0.fullname.contains(searchString)} 
0

在斯威夫特3,你可以用NSPredicate像這樣結合的NSArray:

let searchPredicate = NSPredicate(format: "%K CONTAINS[c] %@", "fullname",searchString) 
let array = NSArray(array: self.dataSource).filtered(using: searchPredicate)