स्विफ्ट कंपाइलर एरर: एनुम केस में संबंधित मूल्य के रूप में एक एकल ट्यूपल है, लेकिन यहां कई पैटर्न हैं


12

Xcode 11.4 बीटा 3 में एक परियोजना का निर्माण करना, मुझे एक स्विम पर यह स्विफ्ट कम्पाइलर त्रुटि मिल रही है:

एनुम मामले में संबंधित मूल्य के रूप में एक एकल टपल है, लेकिन यहां कई पैटर्न हैं, पैटर्न को स्पष्ट रूप से ट्यूप करना और इसके बजाय मिलान करने की कोशिश करना

सोर्स कोड:

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
मैंने सवाल को अपडेट किया, उस बाहर छोड़ने के लिए खेद है
एनेको अलोंसो

परिणाम पहिया को सुदृढ़ करने की कोई आवश्यकता नहीं है; यह पहले से मौजूद है। डेवलपर
13:22

इसके अलावा, कोई Xcode 11.4 बीटा 4 (अभी तक) नहीं है।
मैट

मेरा बुरा, मेरा मतलब था Xcode 11.4 Beta 3. के संबंध में Result, मैं मानता हूं, यह पुराना कोड है जो पूर्वसूचक करता है Swift.Result। हालांकि इस मुद्दे से कोई लेना-देना नहीं है।
एनेको अलोंसो

1
मैं पूरी तरह सहमत हूं, मैं सिर्फ सवाल को साफ करने की कोशिश कर रहा हूं। आप यहां एक अच्छा मुद्दा उठाते हैं और दूसरों को खोजने के लिए सही दृष्टिकोण का दस्तावेजीकरण करने का यह हमारा मौका है।
14:22 पर मैट

जवाबों:


14

मैंने पाया कि आप इस त्रुटि को संबंधित मान को टपल की तरह ट्रीट करके ब्रैकेट के अतिरिक्त सेट में लपेट कर चुप कर सकते हैं:

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

1
यह अच्छा है, मुझे यह पसंद है, धन्यवाद।
एनको अलोंसो

2
letबाहर जाने पर विचार करें यदि आप सब कुछ बाँधने जा रहे हैं, हालांकि: case let .value( (staff, locations) ):और case .value( let (staff, locations) ):दोनों संकलन करते हैं। अपने fave चुनें!
जेसी

1
सुपर माइनर लेकिन मैं शैलीगत रूप से एक टिप्पणी के साथ सब कुछ बांधने के बारे में उपरोक्त टिप्पणी से असहमत हूं। बाध्य होने के नाते बस बाईं ओर रहने से पढ़ने में आसानी होती है और जल्दी से समझ में आ जाता है कि क्या चीजें बाध्य हैं। अन्यथा आपको मानसिक रूप से यह बताने की आवश्यकता है कि क्या बाध्यकारी है। स्विफ्ट के लिए Google के कोडिंग दिशानिर्देश भी एकल कैस्केडिंग के खिलाफ सलाह देते हैं: google.github.io/swift/#pattern-matching
ToddH

2
"Google के दिशानिर्देश": /
Gee.E

9

ठीक है, यह पता लगा। enumसंबंधित मूल्यों के साथ लगता है , जहां मूल्य प्रकार एक टपल है, अब उस तरह स्विच स्टेटमेंट पर मिलान नहीं किया जा सकता है:

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

समाधान

टुप्पल से मानों को Xcode 11.4 (स्विफ्ट 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.
...

}


अतिरिक्त जानकारी के लिए धन्यवाद, और रिलीज नोट्स के लिए लिंक। मैंने यह खो दिया।
एनेको अलोंसो

0

अगर हो सकता है, तो मैं if caseसंस्करण के लिए एक उत्तर भी जोड़ना चाहूंगा ।

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

और फिर निश्चित रूप से मामले की अनदेखी:

if case let .value(staff, _) = result {
    // Do something
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.