ios - 如何在模型中搜索数组属性

标签 ios swift uisearchcontroller

我必须制作一个类似联系人的应用程序。我有一个模型对象。请注意 2 个属性 phoneNumbersaddresses 是数组

class Contact: NSObject {

var name: String?
var companyName: String?
var phoneNumbers: [String]?
var addresses: [String]?

.. // Custom init methods etc

}

现在我必须填充这些并使用搜索 View Controller 搜索它们。

我按照简单的方法,在TableViewController中实现了一个searchViewController。就像这里:https://www.raywenderlich.com/113772/uisearchcontroller-tutorial

func filterContentForSearchText(searchText: String, scope: String = "All") {
    filteredContacts.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@ OR companyName CONTAINS[c] %@", searchController.searchBar.text!, searchController.searchBar.text!, searchController.searchBar.text!)

    let array = (contacts as NSArray).filteredArrayUsingPredicate(searchPredicate)
    filteredContacts = array as! [Contact]

    tableView.reloadData()
}

我的问题是如何搜索电话号码和地址数组?上面的代码可以很好地搜索非数组属性,但是如何搜索数组呢?

最佳答案

以下是您粘贴到 Playground 中的代码,用于测试在数组属性中的搜索。为了清晰起见,我保持搜索功能简单,但可以使用过滤器和闭包来缩短代码。

import UIKit

class Contact  {

      var name: String?
      var companyName: String?
      var phoneNumbers: [String]?
      var addresses: [String]?

      init (name: String, companyName: String, phoneNumbers: [String], addresses: [String]) {
            self.name = name
            self.companyName = companyName
            self.phoneNumbers = phoneNumbers
            self.addresses = addresses
      }
}

var contacts: [Contact] =
      [(Contact.init(name: "Tom Jones", companyName: "Jones", phoneNumbers: ["111-1111", "111-1112", "111-1113"], addresses: ["Hollywood", "New York"])),
       (Contact.init(name: "Aretha Franklin", companyName: "Franklin", phoneNumbers: ["111-1114", "111-1115", "111-1116"], addresses: ["Detroit", "Hollywood"])),
       (Contact.init(name: "Axel Rose", companyName: "Rose", phoneNumbers: ["111-1117", "111-11128", "111-1111"], addresses: ["London", "New York"])) ]

let phoneNumberSearchString = "111-1111"

func searchByPhoneNumber (searchNumber: String, inDataSet contacts: [Contact]) -> [Contact] {
      var searchResult: [Contact] = []
      for contact in contacts {
            for phoneNumber in contact.phoneNumbers! {
                  if phoneNumber == searchNumber {
                        searchResult.append(contact)
                  }
            }
      }
      return searchResult
}

func searchByAddress (searchAddress: String, inDataSet contacts: [Contact]) -> [Contact] {
      var searchResult: [Contact] = []
      for contact in contacts {
            for address in contact.addresses! {
                  if address == searchAddress {
                        searchResult.append(contact)
                  }
            }
      }
      return searchResult
}

let foundContacts = searchByPhoneNumber("111-1111", inDataSet: contacts)

for contact in foundContacts {
      print(contact.name!)
}

let foundContacts2 = searchByAddress("Hollywood", inDataSet: contacts)

for contact in foundContacts2 {
      print(contact.name!)
}

/* Print results

 Tom Jones
 Axel Rose
 Tom Jones
 Aretha Franklin

 */

关于ios - 如何在模型中搜索数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539874/

相关文章:

ios - 每个线程使用的内存量

ios - 一种使用 UIPinchGestureRecognizer UIRotationGestureRecognizer 和 UIPanGestureRecognizer 添加 Instagram 类布局指南的方法?

iOS8 无法隐藏 UISearchController 中搜索栏上的取消按钮

ios8 - 搜索 iOS 8 + XCode 6 后不显示标题 View

ios - 在 iOS (Swift) 上使用当前选择的相机

iOS/Obj-C - 在 View Controller 中的一个 TableView 上实现 UITableViewCellEditingStyleDelete?

ios - 由于内存不足错误无法打开 SQLite 数据库

Swift 更新数组中 Dictionary<String, Any> 内的值

swift - UICollectionView 上的可见单元不能在没有参数的情况下调用

swift - 如何从 UINavigationItem 中关闭 UISearchController?