2016-04-11 4 views
0

私は連絡先のようなアプリを作る必要があります。私はモデルオブジェクトを持っています。 2つのプロパティphoneNumbers & addressesが配列モデルの配列プロパティを検索するには

class Contact: NSObject { 

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

.. // Custom init methods etc 

} 

今、私はこれらを移入し、検索ビューコントローラを使用してそれらを検索する必要がある注意してください。

私は簡単な方法で、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() 
} 

私の問題は、電話番号や住所の配列をthrought検索する方法ですか?上記のコードは、配列以外のプロパティを使用して検索すると効果的ですが、配列を検索するにはどうすればよいですか?

+0

CalZone、Ray Wenderlichチュートリアルでは、複数のプロパティを持つ配列をフィルタリングしています。 –

+0

@SteveRosenbergしかし、どのプロパティも配列ではありません。私のモデルでは、phoneNumbers&addressesは文字列配列 – CalZone

+0

なので、特定の電話番号や住所をすべての連絡先、さらには各連絡先の配列内で検索したいのですか?あなたは、その住所または電話番号を持っている特定の連絡先を返そうとしていますか? –

答えて

0

ここでは、配列であるプロパティ内の検索をテストするためのコードをプレーグラウンドに貼り付けています。私は検索機能を分かりやすくするために単純にしましたが、フィルタとクロージャを使用してコードを短縮することができます。

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 

*/ 
関連する問題