সুইফ্ট সংকলক ত্রুটি: এনামের ক্ষেত্রে সম্পর্কিত মান হিসাবে একক টুপল থাকে তবে এখানে বেশ কয়েকটি নিদর্শন রয়েছে


12

এক্সকোড 11.4 বিটা 3-তে একটি প্রকল্প তৈরি করা হচ্ছে, আমি একটি এনামে এই সুইফ্ট সংকলক ত্রুটি পেয়েছি:

এনামের ক্ষেত্রে সম্পর্কিত মান হিসাবে একক টুপল থাকে তবে এখানে বেশ কয়েকটি নিদর্শন রয়েছে, স্পষ্টতই নিদর্শনগুলিকে টুপলিং করে এবং পরিবর্তে এটির সাথে মিলিয়ে দেখার চেষ্টা করা হচ্ছে

সোর্স কোড:

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

Resultজন্য যুক্ত মান সঙ্গে একটি জেনেরিক enum হয় .errorএবং .value। এই ক্ষেত্রে, সম্পর্কিত মানটি একটি টিপল।

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

এই ত্রুটিটি আগে দেখে দেখে মনে করবেন না এবং এটি অনুসন্ধান করলে কোনও ফল পাওয়া যায়নি। কোন ধারনা?


1
আমি প্রশ্নটি আপডেট করেছি, এটি ছেড়ে দেওয়ার জন্য দুঃখিত
এনেকো অ্যালোনসো

ফলাফল চাকা পুনরায় উদ্ভাবনের প্রয়োজন নেই; এটি ইতিমধ্যে বিদ্যমান। developer.apple.com/docamentation/swift/result
ম্যাট

এছাড়াও, কোনও এক্সকোড 11.4 বিটা 4 নেই (এখনও)।
ম্যাট

আমার খারাপ, আমি Xcode 11.4 বিটা বোঝাতে চাইছি to. শ্রদ্ধেয় Result, আমি সম্মত, এটি পুরাতন কোড যা পূর্বে Swift.Result। যদিও ইস্যুটির সাথে এর কোনও যোগসূত্র নেই।
এনেকো অ্যালোনসো

1
আমি পুরোপুরি একমত, আমি প্রশ্নটি পরিষ্কার করার চেষ্টা করছি। আপনি এখানে একটি ভাল বিষয় উত্থাপন করেন এবং অন্যদের সন্ধানের জন্য সঠিক পদ্ধতির নথিভুক্ত করার আমাদের সুযোগ এটি।
ম্যাট

উত্তর:


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
সুপার মাইনর তবে আমি স্টাইলিস্টিকভাবে একক লেট দিয়ে সবকিছুকে আবদ্ধ করার বিষয়ে উপরের মন্তব্যের সাথে একমত নই। জিনিসটির বাঁদিকে বাঁ দিকে আবদ্ধ থাকা পড়া এবং সহজে কী জিনিস আবদ্ধ তা বোঝা সহজ। অন্যথায় আপনার মানসিকভাবে এক্সট্রোপোলেট করা দরকার যা লেটটি বাধ্যতামূলক। দ্রুততার
টডএইচ

2
"গুগলের" নির্দেশিকা: /
জি.ই.ই.

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

সমাধান

টিপল থেকে মানগুলি এক্সকোড 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/docamentation/xcode_release_notes/xcode_11_4_ রিলিজ_নোটস

কোড যা পূর্বে স্বয়ংক্রিয়ভাবে একটি প্যাটার্নটি টিপল করে সংকলকটির উপর নির্ভর করে Xcode 11.4 এ আপগ্রেড করার সময় কোনও সংকলক ত্রুটি হতে পারে, যদিও কোড আগে সংকলিত হয়েছিল। (58425942)

উদাহরণস্বরূপ, একটি টিউপল টাইপের anচ্ছিক উপর স্যুইচ করার সময় প্রথম বন্ধনী ছেড়ে যাওয়ার ফলে একটি সংকলক ত্রুটি ঘটে:

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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.