[swift] Swift : 스위치 케이스의 옵션 값에 대한 테스트

Swift에서, optional 의 내용에 대해 전환되는 값을 테스트하는 switch 문 에 case를 작성하고 선택 사항에 포함 된 경우 case를 건너 뛰려면 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. ?대신 추가 하는 것은 !나에게 의미가 있지만 (선택적 체인의 정신으로), 컴파일러 오류가 사라지는 것은 아닙니다 (즉, 실제로 선택 사항을 풀지 않음).



답변

선택 사항은 다음 enum과 같습니다.

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

    // ...
}

따라서 일반적인 “연관된 값” 일치 패턴 으로 일치시킬 수 있습니다 .

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")
}

당신은에서 일치하려는 경우 someValue사용, 보호 식을 :

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

그리고 Swift> 2.0

switch someValue {
case let val where val == someOptional:
    print("matched")
default:
    print("didn't match; default")
}


답변

Xcode 7부터 “새로운 x?패턴을 사용하여 선택 사항에 대한 패턴 일치를 .some(x)” 의 동의어로 사용할 수 있습니다 . 이것은 Swift 2 이상에서 다음과 같은 rintaro의 답변 변형 도 작동 한다는 것을 의미합니다 .

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.
}


답변

Swift 4 에서는 Optional : ExpressibleByNilLiteral of Apple을 사용하여 선택 사항 을 래핑 할 수 있습니다 .

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
}


답변