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


12

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)
}

이전에이 오류가 발생한 것을 기억하지 마시고 검색해도 결과가 나오지 않았습니다. 어떤 아이디어?


1
나는 질문을 업데이트, 미안 것을 떠나
Eneko 알론소

결과 휠을 재발 명할 필요가 없습니다. 이미 존재합니다. developer.apple.com/documentation/swift/result
Matt

또한 Xcode 11.4 베타 4 (아직)는 없습니다.
매트

내 나쁜, 나는 Xcode 11.4 베타 3을 의미했다.에 관해서는 Result, 나는 그것이 이전의 오래된 코드라는 것에 동의한다 Swift.Result. 그러나 그것은 문제와 관련이 없습니다.
Eneko Alonso

1
완전히 동의합니다. 질문을 정리하려고합니다. 여기서 좋은 지적을한다면 다른 사람들이 찾을 수있는 올바른 방법을 문서화 할 수 있습니다.
매트

답변:


14

추가 값을 대괄호로 묶어 관련 값을 튜플처럼 처리 하여이 오류를 침묵시킬 수도 있습니다.

switch result {
case .error(let err):
    //
case .value((let staff, let locations)):  
    //
}

1
좋아요, 좋아요, 고마워요
Eneko Alonso

2
let그래도 모든 것을 바인딩하려면 다음 case let .value( (staff, locations) ):case .value( let (staff, locations) ):모두 고려하십시오 . 당신의 fave를 선택하십시오!
Jessy

1
매우 작지만 단일 let으로 모든 것을 바인딩하는 것에 대한 위의 의견에 문체 적으로 동의하지 않습니다. 바인드 된 것의 왼쪽에 렛트를 두는 것은 바인드 된 것을 읽고 이해하기가 더 쉽습니다. 그렇지 않으면 let이 바인딩하는 것을 정신적으로 외삽해야합니다.
신속성

2
"Google의"가이드 라인 : /
Gee.E

9

알았어 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
    // 
}

그것은 확실히 하나의 해결책입니다.
매트

3

이것은 알려진 문제입니다 : 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.
...

}


추가 정보에 감사하고 릴리스 정보에 연결하십시오. 나는 그것을 놓쳤다.
Eneko Alonso

0

가능하다면 if case버전에 대한 답변도 추가하고 싶습니다 .

if case let .value(staff, error) = result {
    // Do something
}

물론 사건을 무시하고 :

if case let .value(staff, _) = result {
    // Do something
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.