2015-03-13 44 views
0

我有此代碼推mutlivalue條目成陣列迅速

swiftAddressBook?.requestAccessWithCompletion({ (success, error) -> Void in 
     if success { 
      if let people = swiftAddressBook?.allPeople { 
       for person in people { 
        println(person.phoneNumbers?.map({$0.value})) 
       } 
      } 
     } 
     else { 
      //no success. Optionally evaluate error 
     } 
    }) 

基本上我想利用每個電話號碼,並將其推入的陣列。

上面的代碼輸出:

Optional(["+11111111111"]) 
Optional(["+11111111111"]) 
Optional(["(111) 111-111"]) 
Optional([" (111) 111-111"]) 
Optional(["+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111", "+11111111111"]) 
Optional(["+11111111111"]) 
Optional(["+11111111111"]) 
Optional(["(111) 111-111"]) 

林好奇2的事情。我可以在我的for循環中添加什麼,以便將每個數字添加到我自己的數組中。此外,爲什麼一個可選有50個數字在其中..

回答

1

假設你只想要一個非可選的電話號碼數組,並樂意扔掉任何零電話號碼(可能這永遠不會發生,並且SwiftAddressBook代碼只需要消除這種可選性,只有返回空數組這將是更好的):

 if success { 
      var numbers: [String] = [] 

      if let people = swiftAddressBook?.allPeople { 
       for person in people { 
        if let personNumbers = person.phoneNumbers { 
         numbers += personNumbers.map { number in 
          number.value 
         } 
        } 
       } 
      } 

      // numbers is an array of all the numbers in the address book 
      println(numbers) 
     } 

原因一個可選的有多個號碼中它是非常簡單的,當你認爲緊靠地址簿 - 人可以有多個電話號碼,所以person.phoneNumbers返回一個數組。你正在提取「價值」屬性,但也有一個「標籤」屬性(家庭,工作,移動等)。

+0

謝謝你的第一個答案,但你的第二個解釋是不正確的。我刪除了上面提供的輸出中的許多值。一個可選字面上有75個左右的數字。這是從我的手機上的地址簿中拉出的,我知道一個聯繫人沒有75個號碼,例如手機,家庭等。 – 2015-03-13 15:51:58

+0

當然,不管 - 我不熟悉圖書館(我在github上看過它),但看起來很可能這是發生了什麼。但是,儘管如此,有多個數字的原因是因爲personNumbers正在返回一個數組(因此輸出中的方括號),並且數組可以有多個數字。嘗試打印出更多的屬性,例如將'number.value'改爲'「\(number.label):\(number.value)」' – 2015-03-13 16:04:12

+0

你說得對。謝謝。當我添加標籤部分時,一個數組有一大堆數字,標籤爲「由Truecaller提供支持」。正如其他人所說的那樣 2015-03-13 16:31:20