2016-05-04 4 views
5

मेरे पास उपयोगकर्ताओं के संपर्क में सभी फोन नंबर पुनर्प्राप्त करने के लिए कुछ कोड है, लेकिन केवल मोबाइल नंबरों को फ़िल्टर करना चाहते हैं। वर्तमान में, मैं सिर्फ यह केवल एक सरणी के लिए "+" या "7" का दूसरा अंक के पहले अंक के साथ जोड़कर मिलने वाले जिन्हें आप नीचे देख कर रहा हूँ,:CNContacts का उपयोग करके केवल मोबाइल नंबरों को तेजी से कैसे लाया जाए?

func findContacts() -> [CNContact]{ 
    let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactPhoneNumbersKey] 
    let fetchRequest: CNContactFetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) 
    var contacts = [CNContact]() 
    CNContact.localizedStringForKey(CNLabelPhoneNumberiPhone) 
    fetchRequest.mutableObjects = false 
    fetchRequest.unifyResults = true 
    fetchRequest.sortOrder = .UserDefault 

    let contactStoreID = CNContactStore().defaultContainerIdentifier() 

    do { 

     try CNContactStore().enumerateContactsWithFetchRequest(fetchRequest) { (let contact, let stop) -> Void in 
      if contact.phoneNumbers.count > 0 { 
       contacts.append(contact) 
      } 
      if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { 
       for phoneNumber:CNLabeledValue in contact.phoneNumbers { 
        let number = phoneNumber.value as! CNPhoneNumber 
        print(number.stringValue) 
        let index = number.stringValue.startIndex.advancedBy(1) 
        let indexPlus = number.stringValue.startIndex.advancedBy(0) 
        if number.stringValue[index] == Character(String(7)) || number.stringValue[indexPlus] == Character("+"){ 
         self.allNumbers.append("\(number.stringValue)") 
        } 
       } 
      } 
     } 

के बाद से संपर्क एक साथ एक iPhone पर जमा हो जाती "मोबाइल" लेबल, मैं सोच रहा था कि केवल इन नंबरों को सरणी में जोड़ा जा सकता है। धन्यवाद :)

उत्तर

6

जांच करें कि संख्या के लेबल इस तरह मोबाइल है:

var mobiles = [CNPhoneNumber]() 

for num in contact.phoneNumbers { 
    let numVal = num.value as! CNPhoneNumber 
    if num.label == CNLabelPhoneNumberMobile { 
     mobiles.append(numVal) 
    } 
} 

तो फिर तुम उस व्यक्ति के लिए मोबाइल फोन नंबर की एक सरणी है।

+2

हार्डकोड न करें '" मोबाइल "'। 'CNLabelPhoneNumberMobile' या' CNLabelPhoneNumberiPhone' का उपयोग करें। लेकिन ध्यान रखें कि यह सभी मोबाइल नंबर नहीं मिलेगा। फ़ोन नंबर जोड़ने पर लोग कस्टम लेबल का उपयोग कर सकते हैं। कोई वास्तव में गलती या किसी भी अन्य संभावनाओं से "घर" लेबल का उपयोग कर सकता है। या कोई उपयोगकर्ता भूमि रेखा पर "मोबाइल" लेबल का उपयोग कर सकता है। अंत में, यह सुनिश्चित करने का कोई तरीका नहीं है कि कोई भी संख्या वास्तव में एक मोबाइल नंबर है। – rmaddy

0

इस पोस्ट में ऐसा करने का एक बेहतर तरीका इस पोस्ट में उल्लिखित है जहां आप flatMap और contains का उपयोग करते हैं। Swift nested filter optimization?

0

अधिक आगंतुकों के लिए एक और तरीका:

for con in contacts 
{ 
    for num in con.phoneNumbers 
     { 
     if num.label == "_$!<Mobile>!$_" 
      { 
       self.contactNames.append(con.givenName) 
       self.contactNums.append(num.value.stringValue) 
        break 
         } 
     else 
      { 
        continue 
      } 
     } 

    } 
संबंधित मुद्दे