Проверка того, равен ли опциональный<Int> нулю

Помогите мне понять эту странную нулевую проверку.

У меня есть переменная типа Int? и мне нужно включить ноль.

В этом есть смысл:

buildFrameId равен 3 и не равен нулю.

Это не так:

buildFrameId равен нулю и все еще не равен нулю

Как проверить (однострочный оператор), равен ли buildFrameId нулю?

У вас есть вложенный опциональный и ... == nil тестирует самый внешний уровень.

Martin R 27.06.2024 13:58

Вы правы @MartinR. Это объявлено так: var buildFrameId: Int?? чтобы добиться того, чтобы нулевое значение было закодировано в формате JSON в «buildFrameId»: null. наличие только одного необязательного знака исключает свойство при кодировании JSON. Есть идеи о том, как дважды развернуть или избежать ??

esbenr 27.06.2024 14:42

@esbenr stackoverflow.com/questions/47266862/…

Roy Rodney 27.06.2024 15:08

@RoyRodney Спасибо за ссылку. Мое решение - это именно первый ответ - если вы проверите комментарии, я тоже прокомментировал. В этой ветке много креативных предложений — все они (кроме ??) просто бельмо на глазу. По крайней мере, для этого должна быть возможность настроить JSONEncoder.

esbenr 27.06.2024 16:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пока @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

  • Я не знаю, почему кто-то проголосовал против этого вопроса — думаю, было бы полезнее прокомментировать, почему.

Другие вопросы по теме