Ошибка команды из-за сигнала: Ошибка сегментации 11 Xcode 8 Swift 3

После интенсивного гугления и мозгового штурма я не могу найти решение, поэтому давайте посмотрим, есть ли в Stack Overflow волшебное решение, которое мне нужно. Я использую структуру контактов для получения дат из контакта. Тем не менее, это работает хорошо, но мне нужно отсортировать даты, чтобы это сработало. В результате я extending и Array из CNContact, и внутри расширения у меня есть функция для выполнения моей работы. Ошибки не отображаются в Issue Navigator, но когда я строю, я получаю проблему в Report Navigator, говорящую Command Failed due to signal: Segmentation Fault 11. Я действительно считаю, что проблема связана с тем, что я использую Generics, потому что навигатор отчетов указывает на эту строку, и мой поиск в Google предполагает, что именно отсюда исходит проблема, но у меня нет обходных путей. (Я очень подозреваю это, но я не совсем уверен.)

Позвольте поделиться с вами своим кодом: Это внутри моего расширения массива CNContacts.

typealias ContactDate = CNLabeledValue<NSDateComponents>
func filteredAndSortedDates() -> [ContactDate : CNContact] { // Error occurs on this line according to the issue.

    var allDates: [ContactDate : CNContact] = [:]

    var sortedDates: [ContactDate: CNContact] = [:]


    for contact in self {
        if contact.isKeyAvailable(CNContactDatesKey) {
            for date in contact.dates {
                allDates[date] = contact
            }
        }
    }

    for (key, value) in (Array(allDates).sorted {
        date1, date2 in
        if date1.key.value.month == date2.key.value.month {
            return date1.key.value.day < date2.key.value.day
        } else {
            return date1.key.value.month < date2.key.value.month
        }
    }) {
        sortedDates[key] = value
    }

    return sortedDates
}

Вот скриншоты проблемы: error1 error2


person Harish    schedule 05.11.2016    source источник
comment
Что такое self в этом примере?   -  person Aaron    schedule 06.11.2016
comment
@Aaron Это [CNContact], потому что помните, что это расширение массива CNContacts?   -  person Harish    schedule 06.11.2016
comment
@Aaron Добавьте свой ответ обратно, он работает!   -  person Harish    schedule 06.11.2016


Ответы (1)


Ваш код вызывает сбой компилятора Swift, когда вы назначаете пустой словарь allDates и/или sortedDates:

var allDates: [ContactDate: CNContact] = [:]
var sortedDates: [ContactDate: CNContact] = [:]

Сначала я подумал, что это из-за того, что CNLabeledValue не соответствует Hashable, но я не думаю, что это проблема с вашим кодом. Например, это приводит к сбою компилятора:

var crashingDict: [CNLabeledValue<NSDateComponents>: CNContact] = [:]

Но это не так:

 var workingDict: [CNContact: CNLabeledValue<NSDateComponents>] = [:]

И во втором примере CNContact как ключ не соответствует Hashable.

Я бы посоветовал поменять местами значения в dict и заставить ваш код работать таким образом. Лучше всего отправить отчет об ошибке в Apple.

person Aaron    schedule 06.11.2016