Помогите мне понять эту странную нулевую проверку.
У меня есть переменная типа Int? и мне нужно включить ноль.
В этом есть смысл:
buildFrameId равен 3 и не равен нулю.
Это не так:
buildFrameId равен нулю и все еще не равен нулю
Как проверить (однострочный оператор), равен ли buildFrameId нулю?
Вы правы @MartinR. Это объявлено так: var buildFrameId: Int?? чтобы добиться того, чтобы нулевое значение было закодировано в формате JSON в «buildFrameId»: null. наличие только одного необязательного знака исключает свойство при кодировании JSON. Есть идеи о том, как дважды развернуть или избежать ??
@esbenr stackoverflow.com/questions/47266862/…
@RoyRodney Спасибо за ссылку. Мое решение - это именно первый ответ - если вы проверите комментарии, я тоже прокомментировал. В этой ветке много креативных предложений — все они (кроме ??) просто бельмо на глазу. По крайней мере, для этого должна быть возможность настроить JSONEncoder.
Пока @martin-r привел меня к причине такого поведения, я сам нашел решение.
«Проблема» в том, что я объявляю переменную как вложенную необязательную:
var buildFrameId: Int??
Это необходимо для того, чтобы JSONEncoder фактически кодировал свойство nil как нулевое, а не пропускал его.
Решение состоит в том, чтобы сгладить вложенный опционал - тогда работает обычная развертка. Я использовал предложенное решение из этой статьи: https://brodigy.medium.com/nested-optionals-in-swift-design-mistake-by-apple-7240ea61edd
Вот код расширения выравнивания:
extension Optional {
public func flatten<Result>() -> Result?
where Wrapped == Result?
{
return self.flatMap { $0 }
}
}
Это все еще не очень хорошо, но это лучше, чем предлагаемые решения по ссылке, предоставленной @roy-rodney. Кодируйте нулевое значение как нулевое с помощью JSONEncoder
У вас есть вложенный опциональный и
... == nil
тестирует самый внешний уровень.