У меня есть перечисление, которое я использую для проверки текста, определенное следующим образом:
enum Validity {
case valid
case invalid(reason: String)
}
My TextValidator
имеет функцию, которая проверяет ввод текста и возвращает Validity
:
func validate(_ string: String) -> Validity
, что удобно, потому что в случае ошибки я могу без особых усилий отобразить причину ошибки валидации.
Однако во многих случаях мне просто нужна логическая проверка, если строка действительна- например, для включения / выключения кнопки отправки.Код, который я сейчас использую для этого:
let validity = validator.validate("user input string")
submitButton.isEnabled = (validity == .valid)
, что плохо читается, и поэтому я бы предпочел написать что-то вроде:
let isValid: Bool = validator.validate("user input string")
submitButton.isEnabled = isValid
иликороче:
submitButton.isEnabled = validator.validate("user input string")
В качестве "быстрого исправления" я определил вычисленное логическое свойство isValid
для моего перечисления Validity
, чтобы я мог по крайней мере написать:
submitButton.isEnabled = validator.validate("user input string").isValid
, номне кажется довольно многословным добавлять .isValid
к результату проверки, и я бы очень предпочел непосредственно проверить достоверность и рассматривать его как логическое значение, когда оно используется в контексте, который ожидает логическое значение через вывод типа.
Итак, мой вопрос:
Есть ли способ сделать перечисление неявно конвертируемым в Bool
в Swift?
Или, если нет: Можете ли вы вспомнитьдругой подход, который сохраняет преимущества обоих типов - Bool и enum?