2015-03-13 67 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