Swift : 스위치 케이스의 옵션 값에 대한 테스트
Swift 에서 선택 사항에 포함 된 경우 case를 건너 뛰고 optional 의 내용에 대해 전환되는 값을 테스트하는 switch 문에 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 (베타 1 릴리스 노트에서)부터 "새로운 x?
패턴을 사용하여 옵션에 대한 패턴 일치를의 동의어로 사용할 수 있습니다 .Some(x)
." 이것은 Xcode 7 이상에서 다음과 같은 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
}
참고URL : https://stackoverflow.com/questions/26941529/swift-testing-against-optional-value-in-switch-case
'development' 카테고리의 다른 글
JsonMappingException : START_ARRAY 토큰에서 벗어남 (0) | 2020.09.24 |
---|---|
git : 치명적 이메일 주소를 자동 감지 할 수 없음 (0) | 2020.09.24 |
git에서 커밋을 스쿼시한다는 것은 무엇을 의미합니까? (0) | 2020.09.24 |
번역 단위의 일부에 대해서만 GCC 경고를 선택적으로 비활성화 하시겠습니까? (0) | 2020.09.24 |
Xcode에서 기본 헤더 주석 라이센스 변경 (0) | 2020.09.24 |