programing

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

oldcodes 2023. 10. 21. 10:49
반응형

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

Swift에서 옵션의 내용과 비교하여 전환되는 값을 테스트하는 스위치 문에 케이스를 작성하려면 어떻게 해야 합니까? 만약 옵션이 다음을 포함한다면 케이스를 건너뜁니다.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. 추가하기?대신에!(선택적 체인의 정신으로) 제게 어느 정도 의미가 있겠지만, 컴파일러 오류가 사라지지는 않습니다 (즉, 실제로 선택적인 것을 풀지는 않습니다).

옵션은 단지 a입니다.enum다음과 같이:

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

    // ...
}

따라서 일반적인 "Associated Values" 일치 패턴으로 일치시킬 수 있습니다.

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에서 "새로운 패턴을 사용하여 옵션과 일치하는 패턴을 만들있습니다."의 동의어입니다.이는 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.
}

Swift 4에서는 Optional of 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
}

모든 경우를 명시적으로 언급할 수 있습니다.nil옵션을 처리하기 위한 추가적인 경우로서:

switch optionalEnumValue {
case .caseOne:
    break
case .caseTwo:
    break
case .caseN:
    break
case nil:
    break
}

언급URL : https://stackoverflow.com/questions/26941529/swift-testing-against-optional-value-in-switch-case

반응형