Swift: testing against optional value in switch case

前端 未结 3 1100
面向向阳花
面向向阳花 2020-12-07 23:45

In Swift, how can I write a case in a switch statement that tests the value being switched against the contents of an optional, skipping over the case if the option

相关标签:
3条回答
  • 2020-12-08 00:16

    In Swift 4 you can use Optional : ExpressibleByNilLiteral of Apple to wrappe optional

    https://developer.apple.com/documentation/swift/optional

    Example

    enum MyEnum {
        case normal
        case cool
    }
    

    some

    let myOptional: MyEnum? = MyEnum.normal
    
    switch smyOptional {
        case .some(.normal): 
        // Found .normal enum
        break
    
        case .none: 
        break
    
        default:
        break
    }
    

    none

    let myOptional: MyEnum? = nil
    
    switch smyOptional {
        case .some(.normal): 
        break
    
        case .none: 
        // Found nil
        break
    
        default:
        break
    }
    

    default

    let myOptional: MyEnum? = MyEnum.cool
    
    switch smyOptional {
        case .some(.normal): 
        break
    
        case .none: 
        break
    
        default:
        // Found .Cool enum
        break
    }
    

    Enum with value

    enum MyEnum {
        case normal(myValue: String)
        case cool
    }
    

    some value

    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
    }
    
    0 讨论(0)
  • 2020-12-08 00:20

    Optional is just a enum like this:

    enum Optional<T> : Reflectable, NilLiteralConvertible {
        case none
        case some(T)
    
        // ...
    }
    

    So you can match them as usual "Associated Values" matching patterns:

    let someValue = 5
    let someOptional: Int? = nil
    
    switch someOptional {
    case .some(someValue):
        println("the value is \(someValue)")
    case .some(let val):
        println("the value is \(val)")
    default:
        println("nil")
    }
    

    If you want match from someValue, using guard expression:

    switch someValue {
    case let val where val == someOptional:
        println(someValue)
    default:
        break
    }
    

    And for Swift > 2.0

    switch someValue {
    case let val where val == someOptional:
        print("matched")
    default:
        print("didn't match; default")        
    }
    
    0 讨论(0)
  • 2020-12-08 00:28

    As of Xcode 7, “a new x? pattern can be used to pattern match against optionals as a synonym for .some(x)”. This means that in Swift 2 and later the following variation of rintaro's answer will work as well:

    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.
    }
    
    0 讨论(0)
提交回复
热议问题