Неустранимая ошибка: неожиданно найдено ноль - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с моим приложением. Я использую func importPhoneBookContact и получаю:

Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

когда я запускаю приложение по адресу:

cnContacts.remove(at: cnContacts.index(of: contact)!)

Как отправить ноль строку в мою функцию?

func importPhoneBookContact(){
    let keysToFetch = [
        CNContactGivenNameKey, // Formatter.descriptorForRequiredKeys(for: .fullName),
        CNContactPhoneNumbersKey,
        CNContactImageDataAvailableKey,
        CNContactThumbnailImageDataKey] as [CNKeyDescriptor]
    let request = CNContactFetchRequest(keysToFetch: keysToFetch)
    var cnContacts = [CNContact]()
    var phoneNumbers = [String]()
    let phoneNumberKit = PhoneNumberKit()
    let store = CNContactStore()
    do {
        try store.enumerateContacts(with: request){ (contact, cursor) -> Void in
            cnContacts.append(contact)
        }

        if cnContacts.count > 0 {
            for contact in cnContacts {
                if contact.phoneNumbers.count > 0 {
                    for phone in contact.phoneNumbers{
                        if PFUser.current() == nil {
                            return
                        }

                        var phoneNumber = phone.value.stringValue
                        phoneNumber = phoneNumber.components(separatedBy: .whitespaces).joined()

                        if (phoneNumber.count) > 3 {
                            if String(phoneNumber[..<phoneNumber.index(phoneNumber.startIndex, offsetBy: 2)]) == "00" {
                                phoneNumber = "+"+String(phoneNumber[phoneNumber.index(phoneNumber.startIndex, offsetBy: 2)...])
                            } else if String(phoneNumber[..<phoneNumber.index(phoneNumber.startIndex, offsetBy: 1)]) != "+" {
                                if let code = (PFUser.current() as! User).countryCode {
                                    phoneNumber = "+"+String(describing: phoneNumberKit.countryCode(for: code)!)+phoneNumber
                                }
                            }
                        }

                        if phoneNumbers.contains(phoneNumber){
                            cnContacts.remove(at: cnContacts.index(of: contact)!)
                        } else{
                            phoneNumbers.append(phoneNumber)
                        }
                    }
                }
            }

            AppDelegate.contacts = cnContacts
            print("phone book contacts: ", AppDelegate.contacts.count)
        }
    } catch let error {
        NSLog("Fetch contact error: \(error)")
        AppDelegate.contactsImported = true
    }
}

1 Ответ

0 голосов
/ 03 июля 2018

Как @Джон Монтгомери уже указал, никогда не изменяйте массив в цикле. Поэтому вместо удаления объекта во время цикла я предлагаю сохранить массив объектов, которые вы хотите удалить, и в конце удалить их. ниже моя обновленная версия.

func importPhoneBookContact(){
    let keysToFetch = [
        CNContactGivenNameKey, // Formatter.descriptorForRequiredKeys(for: .fullName),
        CNContactPhoneNumbersKey,
        CNContactImageDataAvailableKey,
        CNContactThumbnailImageDataKey] as [CNKeyDescriptor]
    let request = CNContactFetchRequest(keysToFetch: keysToFetch)
    var cnContacts = [CNContact]()
    var phoneNumbers = [String]()
    let phoneNumberKit = PhoneNumberKit()
    let store = CNContactStore()
    var contactsToRemove = [CNContact]()
    do {
        try store.enumerateContacts(with: request){ (contact, cursor) -> Void in
            cnContacts.append(contact)
        }

        for contact in cnContacts {
            if contact.phoneNumbers.count > 0 {
                for phone in contact.phoneNumbers{
                    if PFUser.current() == nil {
                        return
                    }

                    var phoneNumber = phone.value.stringValue
                    phoneNumber = phoneNumber.components(separatedBy: .whitespaces).joined()

                    if phoneNumber.count > 3 {
                        if phoneNumber.prefix(2) == "00" {
                            phoneNumber = "+"+String(phoneNumber[phoneNumber.index(phoneNumber.startIndex, offsetBy: 2)...])
                        } else if phoneNumber.prefix(1) != "+",
                            let user = PFUser.current(),
                            let code = user.countryCode,
                            let countryCode = phoneNumberKit.countryCode(for: code) {
                            phoneNumber = "+"+countryCode+phoneNumber
                        }
                    }

                    if phoneNumbers.contains(phoneNumber) {
                        contactsToRemove.append(contact)
                    } else {
                        phoneNumbers.append(phoneNumber)
                    }
                }
            }
        }
        cnContacts = cnContacts.filter({ contactsToRemove.contains($0) })
        AppDelegate.contacts = cnContacts
        print("phone book contacts: ", AppDelegate.contacts.count)
    } catch let error {
        NSLog("Fetch contact error: \(error)")
        AppDelegate.contactsImported = true
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...