Сделать Optional.none оценить до 0 - PullRequest
0 голосов
/ 11 февраля 2019

Дополнительные значения в отличие от nil / NULL по умолчанию не могут сравниваться с числовыми значениями.Какие шаги необходимо предпринять, чтобы, например, nil < 1 и nil < 1.0 были оценены как истинные?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я не уверен, что я бы порекомендовал сделать это, но вы могли бы сделать что-то вроде этого, например, для целых чисел, чтобы сначала проверить, равен ли он нулю, и если это так, просто сравнить с 0. Вам придется повторить эту вещь для перевернутогопараметры и то же самое для других типов.

extension Optional where Wrapped == Comparable {
    public static func < (lhs: Wrapped?, rhs: Int) -> Bool {
        guard let left = lhs as? Int else {
            return 0 < rhs
        }
        return left < rhs
    }
}
0 голосов
/ 11 февраля 2019

nil == 0 никогда не будет оцениваться как истина, потому что это ложь.Точно так же 1 == 0 не будет оцениваться как true, и вы не сможете предпринять разумных шагов, чтобы это сделать.Неравные вещи не должны возвращать true для ==.

Синтаксис, который вы хотите, это (nil ?? 0) == 0, что верно.

Но если вы обнаружите, что пытаетесь рассматривать ноль как 0 очень часто (достаточно часто, чтобы вы захотели какую-то особую обработку), тогда это говорит о том, что ваш тип неверен.Почему эта переменная является необязательной?Похоже, что эта переменная должна быть просто Int в первую очередь.Если он входит в вашу систему как необязательный (чаще всего через JSON), вы должны преобразовать его в необязательный тип как можно раньше и использовать его во всей остальной системе.Подавляющее большинство переменных и свойств в Swift не должно быть необязательным.Если это так (и многие люди совершают эту ошибку), вы обнаружите, что постоянно сражаетесь с системой.


Для вашего редактирования Свифт использовал, чтобы позволить вам использовать < с нолем таким образом.Он был удален специально ( SE-0121 ), потому что он вызывает так много очень тонких ошибок (точно так же, как неявное лечение NULL, поскольку 0 долго вызывало ошибки в C и ObjC).Вы определенно не должны пытаться вернуть это обратно. Это действительно плохая семантика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...