Как в Swift я могу написать регистр в операторе switch, который проверяет переключаемое значение на содержание необязательного , пропуская регистр, если необязательный параметр содержит nil
?
Вот как я себе это представляю:
let someValue = 5
let someOptional: Int? = nil
switch someValue {
case someOptional:
// someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
// either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}
Если я просто пишу это именно так, компилятор жалуется , что someOptional
не разворачивали, но если я явно разворачивать его, добавив !
к концу, я, конечно , получаю ошибку во время выполнения в любое время someOptional
содержит nil
. Добавление ?
вместо !
имело бы для меня некоторый смысл (я полагаю, в духе необязательной цепочки), но не устраняет ошибку компилятора (т.е. фактически не разворачивает необязательное).
источник
Начиная с Xcode 7, «новый
x?
шаблон может использоваться для сопоставления шаблонов с дополнительными параметрами в качестве синонима для.some(x)
». Это означает, что в Swift 2 и более поздних версиях также будет работать следующий вариант ответа Ринтаро :let knownValue = 5 switch someOptional { case knownValue?: // Contents of someOptional are knownValue, defined above. case let otherValue?: // Contents of someOptional are *any* non-nil value not already tested for. // Unwrapped contents are assigned to otherValue for use inside this case. default: // someOptional is nil. }
источник
someValue?
есть какое-то другое определенное значение, ноcase let val?
это просто безопасная развернутая версияsomeOptional
?!let
больше не компилируется. Я не могу вспомнить прямо сейчас, почему это могло сработать тогда.В Swift 4 вы можете использовать Optional: ExpressibleByNilLiteral от Apple, чтобы обернуть optional
https://developer.apple.com/documentation/swift/optional
пример
enum MyEnum { case normal case cool }
некоторые
let myOptional: MyEnum? = MyEnum.normal switch smyOptional { case .some(.normal): // Found .normal enum break case .none: break default: break }
никто
let myOptional: MyEnum? = nil switch smyOptional { case .some(.normal): break case .none: // Found nil break default: break }
по умолчанию
let myOptional: MyEnum? = MyEnum.cool switch smyOptional { case .some(.normal): break case .none: break default: // Found .Cool enum break }
Перечислить со значением
enum MyEnum { case normal(myValue: String) case cool }
некоторая ценность
let myOptional: MyEnum? = MyEnum.normal("BlaBla") switch smyOptional { case .some(.normal(let myValue)) where myValue == "BlaBla": // Here because where find in my myValue "BlaBla" break // Example for get value case .some(.normal(let myValue)): break // Example for just know if is normal case enum case .some(.normal): break case .none: break default: break }
источник
ExpressibleByNilLiteral
но тогда это фактически не используется в объявлениях перечисления и т. Д. Что это такое?