Ошибка Swift 5 LLDB: предупреждение: <EXPR>: 12: 9: предупреждение: инициализация переменной '$ __ lldb_error_result' никогда не использовалась - PullRequest
6 голосов
/ 15 апреля 2019

Полное сообщение об ошибке:

error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
    var $__lldb_error_result = __lldb_tmp_error
    ~~~~^~~~~~~~~~~~~~~~~~~~
    _

error: <EXPR>:19:5: error: use of unresolved identifier '$__lldb_injected_self'
    $__lldb_injected_self.$__lldb_wrapped_expr_7(
    ^~~~~~~~~~~~~~~~~~~~~

Эта ошибка появляется в консоли, когда я запрашиваю значение свойства Dictionary<String, String> в универсальном UITableViewController (TVC).

Подробнее...

У меня есть общий TVC (отмеченный выше), который более или менее основан на структуре, изложенной в книге «Основные данные» Флориана Куглера и Даниэля Эггертта, и принимает, среди прочего, универсальныйзначение T.

class TVCDataSource_List<T: Managed, etc...>

Этот универсальный TVC содержит словарь, предназначенный для хранения списка более длинных «альтернативных» имен для заголовков разделов TVC.

var dictionarySectionData: [String: String] = [:]

выбран для программирования TVC таким образом, поскольку представляется более эффективным хранить ссылку на имя в виде коротких двух символов String в атрибуте модели данных (идентификатор раздела), чем длинное имя в виде String.

Я пытался заполнить этот словарь в разных местах кода, большинство из которых работает, но все с одинаковым результатом, а именно:

  • Я перебираю код с помощью отладчика и, какожидается, что словарь заполняется с помощью одного запроса на выборку в постоянное хранилище;
  • Сразу после этого вызов на консоль print(dictionarySectionData.description) выводит правильно заполненный словарь, как и ожидалось;
  • Опрос LLDB с помощью p dictionarySectionData (или po) непосредственно перед и после этого print на консоль выдает полное сообщение об ошибке, детализированное в начале этого вопроса;
  • В то же время помощникСредство просмотра переменных редактора показывает, что словарь пуст, что неожиданно конфликтует с печатью;
  • Я продолжаю шагать по коду для создания TVC, так как в словаре больше нет пар «ключ-значение», я не могу вспомнитьзначение для моего заголовка раздела и, как и ожидалось, консоль сообщает: «Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения».

Я провел небольшое простое исследование:

  1. Этот Блог Скотта Берревоца под названием «Перепривязывание себя: точка разрыва (отрыва) отладчика».
  2. Это Отчет об быстрой ошибке Кит Смайли под названием "LLDB: предупреждение: инициализация переменной '$ __ lldb_error_result'".
  3. Это Отчет о быстрой ошибке Зев Айзенберг под названием «Ошибка: использование необъявленного типа« $ __lldb_context »в расширении NSAttributedString».

Кажется, что я мог либо:

  • наткнуться на ошибкув компиляторе;или
  • попытался установить значение для словаря в общем TVC таким образом, чтобы компилятор интерпретировал попытку повторной привязки к себе ??

Откровенно говоря, ни то, ни другое, что я понимаю иот моего поверхностного знания компилятора и Swift у меня уйдут месяцы, возможно годы обучения и опыта.Который я с удовольствием накапливаю со временем.

У меня действительно есть удовлетворительное решение ... вместо создания словаря более длинных «альтернативных» имен для заголовков разделов TVC в начале жизненного цикла TVCЯ запускаю запрос на выборку КАЖДЫЙ РАЗ, когда код разрешает имя для текущего заголовка раздела TVC.Это работает отлично и не блокирует пользовательский интерфейс (пока).

Однако меня действительно раздражает, что я не могу запустить одну выборку в начале построения моего общего TVC, чтобы подготовить краткий словарь более длинной альтернативы'имена для заголовков разделов TVC и вместо этого должны запускать выборку для каждого раздела, который пользователь решает прокрутить.Выполнение одной выборки и удержание в памяти словаря из 12-15 пар значений ключей кажется гораздо более эффективным, чем выполнение множества выборок.

Кто-нибудь сталкивался с этой проблемой?

Если да, то вы?в состоянии предложить какой-либо совет?


ОБНОВЛЕНИЕ

Проблема, кажется, связана с моим использованием - или, возможно, более правильно, моим неправильным использованием - явно развернутого Optional.

Воткод, который я использую для заполнения словаря ...

func createDictionaryOfSectionHeaderText() {

    let request = Types.preparedFetchRequest
    // noting .preparedFetchRequest is a static var, available through generics

    let key = "typeParent.typeParentName"
    let name = "Taxonomy"
    let predicate = NSPredicate(format: "%K == %@", argumentArray: [key, name])

    request.predicate = predicate

    var results: [Types] = []

    do {

        results = try <<My NSManagedObjectContext>>.fetch(request)
    }
    catch {

        let fetchError = error
        print(fetchError)
    }

    for type in results {

        let formatSortOrder = String(format: "%02d", type.sortOrder)
        dictionarySectionData[formatSortOrder] = type.typeName
    }
}

Было два элемента кода, которые вызвали сообщение об ошибке ...

A.Как указано выше в func createDictionaryOfSectionHeaderText()

let stringSortOrder = String(type.sortOrder)
let formatSortOrder = String(format: "%02d", stringSortOrder)

..., который подает строку в формат "% 02d", неопределенный эффект ... TBA.

(теперь измененоот этих двух строк до единого let formatSortOrder = String(format: "%02d", type.sortOrder) - который, конечно, работает.)

B.В методе UITableViewDelegate func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

stringHeaderText = dictionarySectionData[stringSectionName]!
// "Fatal error: Unexpectedly found nil while unwrapping an Optional value"

..., который, следуя дополнительному размышлению по этому вопросу, точно соответствует ожидаемому при явном развертывании Optional, когда этот Optional равен nil !!

Итак, когда я изменяю установщик на stringHeaderText, удаляя инструкцию для явного развертывания, и вместо этого предлагая значение по умолчанию, когда ноль, моя проблема программирования исчезает.

stringHeaderText = dictionarySectionData[stringSectionName] ?? "ERROR"

Я могу даже предоставитьответьте, если / когда я это лучше понимаю.

...