С тех пор, как я обновился до 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
до того, как оно будет выделено ... Это ноль, отлично:

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

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

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

Независимо от того, просматриваю ли я 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/?