Swift Derleyici Hatası: Numaralandırma durumunda ilişkili bir değer olarak tek bir grup vardır, ancak burada birkaç desen vardır


12

Xcode 11.4 beta 3'te bir proje oluştururken, bu Swift Derleyici hatasını bir numarada alıyorum:

Numaralandırma durumunda ilişkili bir değer olarak tek bir grup vardır, ancak burada birkaç desen vardır, desenleri dolaylı olarak tupling eder ve bunun yerine eşleştirmeye çalışır

Kaynak kodu:

switch result {
case .error(let err):
    //
case .value(let staff, let locations):  // <-- error on this line
    //
}

Result.errorve için ilişkili değerlere sahip genel bir numaralandırmadır .value. Bu durumda, ilişkili değer bir kümedir.

public enum Result<T> {
    case value(T)
    case error(Error)
}

Bu hatayı daha önce gördüğünüzü hatırlamayın ve aramak, herhangi bir sonuç vermedi. Herhangi bir fikir?


1
Soruyu güncelledim, dışarıda bıraktığım için üzgünüm
Eneko Alonso

Sonuç tekerleğini yeniden keşfetmeye gerek yoktur; zaten var. developer.apple.com/documentation/swift/result
matt

Ayrıca, Xcode 11.4 beta 4 (henüz) yoktur.
matt

Benim hatam, ilgili olarak Xcode 11.4 beta 3 geliyordu etmek Result, kabul ediyorum, bu önceden varolduğunu eski kodu Swift.Result. Bunun konuyla hiçbir ilgisi yok.
Eneko Alonso

1
Tamamen katılıyorum, sadece soruyu temizlemeye çalışıyorum. Burada iyi bir noktaya değindiniz ve bu, başkalarının bulması için doğru yaklaşımları belgeleme şansımız.
matt

Yanıtlar:


14

Ek bir parantez kümesine sararak ilişkili değeri daha çok bir demet gibi işleyerek bu hatayı susturduğumu buldum:

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

1
Bu hoş, hoşuma gitti, teşekkür ederim.
Eneko Alonso

2
letYine de her şeyi bağlayacaksanız dışarı çıkmayı düşünün : case let .value( (staff, locations) ):ve case .value( let (staff, locations) ):her ikisi de derlenir. Favori seçin!
Jessy

1
Süper küçük ama stilistik olarak her şeyi tek bir izin ile bağlama hakkında yukarıdaki yorum ile katılmıyorum. Bağlı olan şeyin sadece soluna izin vermek, okunan şeyleri okumak ve hızlı bir şekilde neyin bağlı olduğunu anlamak daha kolaydır. Aksi takdirde, izin neyin bağlayıcı olduğunu zihinsel olarak tahmin etmeniz gerekir. Google'ın hızlı kodlama yönergeleri de tek basamaklı izin almasını
ToddH

2
"Google'ın" yönergeleri: /
Gee.E

9

Tamam, anladım. Görünüşe enumdeğer türü, artık böyle bir switch ekstresinde eşleştirilebilir bir tupple olduğunu ilişkili değerlere sahip:

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

Çözüm

Tupple'dan gelen değerler Xcode 11.4'te (Swift 5.2) manuel olarak çıkarılmalıdır:

// Works on Xcode 11.4
switch result {
case .error(let err):
    //
case .value(let tupple):  
    let (staff, locations) = tupple
    // 
}

Bu kesinlikle tek bir çözüm.
matt

3

Bu bilinen bir sorundur: https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_release_notes

Derleyiciye bir kalıbı otomatik olarak bağlayan kod, daha önce derlenmiş olsa bile Xcode 11.4'e yükseltirken derleyici hatasına neden olabilir. (58425942)

Örneğin, bir tuple tipi isteğe bağlı açıldığında parantezleri dışarıda bırakmak bir derleyici hatasına neden olur:

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
...

}

Geçici çözüm : Deseni açıkça ayarlamak için fazladan parantez ekleyin:

switch x {
case .some(((let a, let b), let c)): // Notice the extra pair of parentheses.
...

}


Ek bilgi için teşekkürler ve sürüm notlarına bağlantı verin. Onu özledim.
Eneko Alonso

0

Yapabilirsem, if casesürüm için de bir cevap eklemek istiyorum .

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

ve elbette durumu görmezden geliyor:

if case let .value(staff, _) = result {
    // Do something
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.