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は、(私は安全な方法でそれをアンラップしようとし、コンパイラは、それが任意のタイプではないと言う)がオプションではないので、私はゼロが、そのない場合をアンラップすることができると思いました。コメントから
クラッシュした場合は、デバッガの 'cont.phoneNumbers.first?.value'の値を調べてください(または単に出力してください)。 –
キャスティングなしで印刷して文字列にすることを意味しますか? – Eyzuky
はい、クラッシュしたものとOKのものについて不審なものがあるかどうかを確認するだけです。 –