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
}