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
'programing' 카테고리의 다른 글
테스트 요소 지시 - 테스트 중에 분리된 스코프 메서드에 액세스할 수 없습니다. (0) | 2023.10.21 |
---|---|
PL/SQL에서 텍스트를 XML 호환 텍스트로 변환/인코딩하는 방법이 있습니까? (0) | 2023.10.21 |
ElectronJS에서 DIV를 인쇄하는 방법 (0) | 2023.10.21 |
라디오 버튼을 기준으로 WooCommerce 체크아웃에서 항목 세율 변경 (0) | 2023.10.21 |
Django - mysqlclient 오류 설치: mysqlclient 1.3.13 이상이 필요합니다. 0.9.3이 있습니다. (0) | 2023.10.21 |