Установленная необязательная переменная отображается как ноль в отладчике XCode - PullRequest
3 голосов
/ 26 сентября 2019

С тех пор, как я обновился до Xcode 11 и Swift 5.1, я столкнулся со странной проблемой - после создания экземпляра необязательной переменной она все равно может отображаться как nil в отладчике Xcode!

У меня есть необязательная переменная класса с именем booking:

var booking: Booking?

Это типа Booking:

public struct Booking: Codable {
    var id: Int?
    var start_time: Date?
    var payment_currency: String = "USD"
    var payment_amount: Int?
}

Когда я прохожу кодЯ могу видеть booking до того, как оно будет выделено ... Это ноль, отлично:

enter image description here

Затем, после того как оно выделено ... Что, все еще ноль??:

enter image description here

Я задавался вопросом, рассматривалось ли это как-то как ленивая переменная.Но на самом деле это не ноль, потому что к нему можно получить доступ:

enter image description here

После поиска некоторое время я задавался вопросом, не смогла ли моя схема сборки в Xcodeиметь свой флаг "Отладка исполняемого файла".Но это так.Я даже убрал и перестроил проект с выключенным флагом, чтобы быть уверенным.

enter image description here

Независимо от того, просматриваю ли я booking в представлении переменных или введите p booking в представлении консоли, оно отображается как ноль.

Что здесь происходит?Мне нужна предсказуемость отладки, которую я имел до этого обновления.

ОБНОВЛЕНИЕ

Я нашел простой способ воспроизвести проблему.Сначала создайте пустой проект с одним представлением и добавьте его в начало AppDelegate.swift:

public struct Booking: Codable {
    var start_time: Date?
    var payment_currency: String = "USD"
}

Затем добавьте эти строки в приложение (_: didFinishLaunchingWithOptions :) func:

booking = Booking()
print("booking.payment_currency = \(booking?.payment_currency ?? "NULL")")

Установите точку останова как до, так и при запуске, обратите внимание, что отладчик показывает бронирование как ноль даже после назначения, как в моем исходном случае.

Затем закомментируйте start_timeпеременная, перезапустите и обратите внимание, что теперь отладчик показывает, что booking имеет значение после назначения, как и следовало ожидать.

Таким образом, кажется, что переменные Date, необязательные или нет, в такой структуре приводят к путанице в отладке.В частности, переменные даты - измените переменную на другие типы, такие как Int, Int ?, String, String? ... и это не проблема.

Если я не пропустил что-то очень простое, мне кажется, что это ошибка в отладчике Xcode.Если да, то лучший способ сообщить об этом - https://developer.apple.com/bug-reporting/?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Похоже, я нашел ошибку в Xcode 11. Она легко воспроизводится, как указано в ОБНОВЛЕНИЕ выше.Я подал ошибку в Apple.

Я все еще ищу обходной путь, так как я использую довольно много структур, содержащих переменные Date.Если кто-нибудь может найти его, пожалуйста, прокомментируйте ниже.

0 голосов
/ 29 сентября 2019

Причина ошибки не в том, что var start_time: Date? присутствует или отсутствует, а в том, что Date является наложением Swift Foundation.Если вы удалите соответствие Codable и сделаете start_time NSDate?, все в порядке.Очевидно, что LLDB смущает типы оверлеев Swift, такие как Date?.

В этот связанный вопрос , мы видим ту же проблему с URL?.Если мы изменим его на NSURL?, все будет хорошо.

Я не говорю, что это жизнеспособный обходной путь!Вы хотите и должны использовать типы Swift.Я просто говорю, что это то, что портит LLDB.Вы можете включить эту информацию, когда сообщаете об ошибке.

...