Xcode 11.4 베타 3에서 프로젝트를 빌드하면 열거 형 에서이 Swift Compiler 오류가 발생합니다.
열거 형 케이스에는 연관된 값으로 단일 튜플이 있지만 여기에는 여러 패턴이 있습니다. 암시 적으로 패턴을 튜플 링하고 대신 일치시킵니다.
소스 코드:
switch result {
case .error(let err):
//
case .value(let staff, let locations): // <-- error on this line
//
}
Result
에 관련된 값을 가진 일반적인 열거입니다 .error
및 .value
. 이 경우 관련 값은 트리플입니다.
public enum Result<T> {
case value(T)
case error(Error)
}
이전에이 오류가 발생한 것을 기억하지 마시고 검색해도 결과가 나오지 않았습니다. 어떤 아이디어?
답변
추가 값을 대괄호로 묶어 관련 값을 튜플처럼 처리 하여이 오류를 침묵시킬 수도 있습니다.
switch result {
case .error(let err):
//
case .value((let staff, let locations)):
//
}
답변
알았어 enum
값 유형이 tupple 인 연관된 값 과 같은 것으로 더 이상 다음과 같은 switch 문에서 일치시킬 수 없습니다.
// Works on Xcode 11.3.1, yields error on 11.4 (Swift 5.2)
switch result {
case .error(let err):
//
case .value(let staff, let locations):
//
}
해결책
Tupple의 값은 Xcode 11.4 (Swift 5.2)에서 수동으로 추출해야합니다.
// Works on Xcode 11.4
switch result {
case .error(let err):
//
case .value(let tupple):
let (staff, locations) = tupple
//
}
답변
이것은 알려진 문제입니다 : https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_release_notes
컴파일러가 자동으로 패턴을 터플 링하는 코드는 Xcode 11.4로 업그레이드 할 때 코드가 컴파일 되더라도 컴파일러 오류가 발생할 수 있습니다. (58425942)
예를 들어, 튜플 유형의 옵션을 켤 때 괄호를 생략하면 컴파일러 오류가 발생합니다.
switch x { // error: switch must be exhaustive
case .some((let a, let b), let c): // warning: the enum case has a
// single tuple as an associated value, but there are several
// patterns here, implicitly tupling the patterns and trying
// to match that instead
...
}
해결 방법 : 괄호를 추가하여 패턴을 명시 적으로 터플하십시오.
switch x {
case .some(((let a, let b), let c)): // Notice the extra pair of parentheses.
...
}
답변
가능하다면 if case
버전에 대한 답변도 추가하고 싶습니다 .
if case let .value(staff, error) = result {
// Do something
}
물론 사건을 무시하고 :
if case let .value(staff, _) = result {
// Do something
}