2016-11-15 7 views
5

अद्यतन यह स्विफ्ट 3.1स्विफ्ट 3 में इस स्विच कथन में टाइप अनुमान क्यों काम नहीं कर रहा है?

में तय हो गई है एक switch बयान करने के लिए एक if-else माइग्रेट करते समय, मैंने देखा है कि प्रकार निष्कर्ष काम नहीं कर रहा था। मुझे में HKQuantityTypeIdentifier निर्दिष्ट करने की आवश्यकता क्यों है जब quantityTypeIdentifier पहले से ही उस प्रकार का है?

func process(samples: [HKSample]?, quantityTypeIdentifier: HKQuantityTypeIdentifier) { 
    DispatchQueue.main.async { [weak self] in    
     if let quantitySamples = samples as? [HKQuantitySample] { 
      for sample in quantitySamples { 
       switch quantityTypeIdentifier { 
       case HKQuantityTypeIdentifier.distanceWalkingRunning: 
        // code 

       case HKQuantityTypeIdentifier.activeEnergyBurned: 
        // code 

       case HKQuantityTypeIdentifier.heartRate: 
        // code 

       default: 
        fatalError("Quantity Type Identifier not implemented \(quantityTypeIdentifier)") 
       } 
      } 
     } 
    } 
} 

मैं जैसे फ़ंक्शन को कॉल करने में सक्षम हूँ:

process(samples: samples, quantityTypeIdentifier: .distanceWalkingRunning) 
+1

'HKQuantityTypeIdentifier' एक enum प्रकार नहीं है। यह एक संरचना है। शायद यही कारण है। – vadian

+0

मैं स्विफ्ट पुस्तक में कुछ भी नहीं ढूंढ पा रहा हूं, लेकिन मुझे ऐसा लगता है कि अगर 'मात्रा मात्रा टाइप करेंइंडिफायर ==। डिस्टेंस वाल्किंग राउंडिंग {}' काम करता है, तो स्विच स्टेटमेंट इसे भी संभालने में सक्षम होना चाहिए। – jjatie

+0

क्या ओब्जे-सी के साथ संगतता के लिए यह 'संरचना'' enum' नहीं है? – jjatie

उत्तर

3

मुझे लगता है कि आप एक बग पाया है, या कम से कम आप एक दावा करने के लिए एक उचित मामला है। विसंगति अच्छी तरह से एक बहुत छोटे उदाहरण के द्वारा दिखाया गया है:

let c : UIColor = .red 
switch c { 
case .red : print ("red") // error 
default : break 
} 

कि संकलन नहीं होंगे। आप पहली पंक्ति पर .red कह सकते हैं लेकिन तीसरी पंक्ति पर नहीं। यह एक स्पष्ट असंगतता प्रतीत होता है।

अब, यह कहकर, मैं निश्चित रूप से समझा सकता हूं कि दो अलग-अलग स्थानों में नियम अलग क्यों हैं। case अभिव्यक्ति ~= ऑपरेटर और पैटर्न बनाने के नियमों के अनुसार हल की गई है। वे नियम स्विफ्ट में किसी और चीज से अलग हैं (इसलिए, उदाहरण के लिए, ऐसी स्थितियां हैं जहां आप ascase पैटर्न में कहते हैं लेकिन as? हर जगह कहेंगे)। तो जाहिर है वे नियम हैं जिन्हें काम करने के लिए tweaking की आवश्यकता होगी। उन्हें अब तक ट्विक किया गया है ताकि नंगे एनम के मामलों की अनुमति दी जा सके, लेकिन नंगे एनम जैसी संरचना "मामलों" (यानी, स्ट्रक्चर के स्थिर सदस्य जो कच्चे प्रतिनिधि हैं, जहां वे स्थिर सदस्य स्वयं संरचना के उदाहरण का मूल्यांकन करते हैं)।

let c : UIColor = .red 
switch true { 
case c == .red : print ("red") // heh heh 
default : break 
} 

true चालू करने और पूरे बूलियन हालत हम पैटर्न मिलान और फिर से दर्ज की सीमा को तोड़ने लिखने द्वारा:

अंत में, यहाँ एक skanky वैकल्पिक हल है कि मैं का उपयोग करने के लिए जब case पैटर्न भी महती बन चाहते है सामान्य अभिव्यक्ति की दुनिया।

संबंधित मुद्दे