2017-05-17 6 views
0

これは私のコードです。ログにエラーメッセージを表示せずにデータを印刷する途中でアプリがクラッシュします。連絡先の名前と番号の印刷中にアプリがクラッシュする

:私はこのメッセージが私のコードでの表示されます// CRASHでコードの行をマークします

Thread 1: EXC_BREAKPOINT (code=1, subcode =.....) 

:それはクラッシュしたコードの行にこのメッセージを表示して、約30人、その後、クラッシュを印刷します

import UIKit 
import Contacts 
class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    for cont in contacts { 
     print(cont.givenName) 
     let num = ((cont.phoneNumbers.first?.value)! as CNPhoneNumber).stringValue //CRASH 
     print(num) 
    } 
    // Do any additional setup after loading the view, typically from a nib. 
} 

lazy var contacts: [CNContact] = { 
    let contactStore = CNContactStore() 
    let keysToFetch = [ 
     CNContactFormatter.descriptorForRequiredKeys(for: .fullName), 
     CNContactEmailAddressesKey, 
     CNContactPhoneNumbersKey, 
     CNContactImageDataAvailableKey, 
     CNContactThumbnailImageDataKey] as [Any] 

    // Get all the containers 
    var allContainers: [CNContainer] = [] 
    do { 
     allContainers = try contactStore.containers(matching: nil) 
    } catch { 
     print("Error fetching containers") 
    } 

    var results: [CNContact] = [] 

    // Iterate all containers and append their contacts to our results array 
    for container in allContainers { 
     let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) 

     do { 
      let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor]) 
      results.append(contentsOf: containerResults) 
     } catch { 
      print("Error fetching results for container") 
     } 
    } 

    return results 
}() 

}

Iは、(私は安全な方法でそれをアンラップしようとし、コンパイラは、それが任意のタイプではないと言う)がオプションではないので、私はゼロが、そのない場合をアンラップすることができると思いました。コメントから

+1

クラッシュした場合は、デバッガの 'cont.phoneNumbers.first?.value'の値を調べてください(または単に出力してください)。 –

+0

キャスティングなしで印刷して文字列にすることを意味しますか? – Eyzuky

+0

はい、クラッシュしたものとOKのものについて不審なものがあるかどうかを確認するだけです。 –

答えて

1

問題は、それが何の電話番号(したがって、評価することがありません最初の)が存在しない場合はnilとなりますので、強制的にcont.phoneNumbers.first?.valueのアンラップをであることが判明しました。

関連する問題