[swift] Swift Compiler Error : 열거 형 케이스에는 연관된 값으로 단일 튜플이 있지만 여기에는 몇 가지 패턴이 있습니다.

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
}


답변