2015-03-30 11 views
9

मैं समझता हूँ कि क्या वैकल्पिक स्विफ्ट में हैं, लेकिन मैं सिर्फ, अगर मैं दो '!' Xcode का उपयोग नहीं करते, जहां एक संकलक त्रुटि केOptionals की स्विफ्ट डबल unwrapping

मूल्य देता है का सामना करना पड़ा एक "डबल वैकल्पिक 'लिपटा वैकल्पिक प्रकार 'स्ट्रिंग?' अनचाहे नहीं; क्या आप '!' का उपयोग करना चाहते थे या '?'?

मेरे पास निम्न कोड है, जहां appNSRunningApplication प्रकार का है।

let name: String = app.localizedName! 

मुझे दो ! का उपयोग क्यों करना चाहिए? परिवर्तनीय को खोलने के लिए पर्याप्त नहीं है क्योंकि यह var localizedName: String? प्रकार है।

प्रसंग: Xcode, मुझे let name: String = app.localizedName!! उपयोग करना चाहते हैं अन्यथा यह ऊपर संकलक त्रुटि देता है। app चर के रूप में परिभाषित किया गया है का पालन:

var apps = NSWorkspace().runningApplications.filter{$0.activationPolicy == NSApplicationActivationPolicy.Regular} 
for app in apps{ 
    //code posted above 
    … 
} 

तो मुझे पता है कि app एक वैकल्पिक नहीं है और हमेशा एक मूल्य है, और न ही यह एक वैकल्पिक आवेदन है।

पीएस तेजी से गणना का उपयोग करते समय प्रकार को परिभाषित करने का कोई तरीका है? for Foo(app) in apps की तरह apps = [AnyObject]

+2

'ऐप' वास्तव में कितना परिभाषित किया गया है? क्या यह एक * वैकल्पिक * NSRunning अनुप्रयोग हो सकता है? –

+0

हम उत्तर के लिए ठोकर खा रहे हैं क्योंकि कोड की उस पंक्ति को उस त्रुटि का उत्पादन नहीं करना चाहिए। यदि ऐप वैकल्पिक था, तो आपको अलग-अलग त्रुटि मिल जाएगी। और 'localizedName' एक" डबल वैकल्पिक "(एलओएल) नहीं है। कोड की यह पंक्ति ठीक दिखती है और उस त्रुटि को उत्पन्न नहीं करनी चाहिए। दुर्भाग्य से, दुर्भाग्यवश, भ्रामक त्रुटियों को उत्पन्न कर सकता है, और मुझे आश्चर्य है कि वास्तविक समस्या कोड की पिछली पंक्ति में शेष है (या शायद आपने प्रश्न तैयार करते समय कोड की रेखा को बदल दिया है या अन्यथा साफ़ किया है)। साथ ही, जब मुझे अयोग्य त्रुटियां मिलती हैं, तो मैं प्रोजेक्ट को साफ़ करता हूं, एक्सकोड छोड़ देता हूं, व्युत्पन्न डेटा फ़ोल्डर खाली करता हूं, और एक्सकोड को पुनरारंभ करता हूं। – Rob

+0

@MartinR अधिक जानकारी जोड़ा गया। मदद के लिए चीयर्स। – user14492

उत्तर

4
समस्या

कि NSWorkspace().runningApplications रिटर्न जो NSRunningApplication की एक सरणी के लिए डाली जानी है AnyObject के सरणी है:

let apps = NSWorkspace().runningApplications as! [NSRunningApplication] 
let filteredApps = apps.filter { 
     $0.activationPolicy == NSApplicationActivationPolicy.Regular 
} 
for app in apps { 
    let name: String = app.localizedName! 
} 
+0

एक्सकोड ऊपर दिए गए कोड के लिए एक त्रुटि दिखाता है। आपको शायद 'as'' के साथ 'as'' को प्रतिस्थापित करना चाहिए: 'ऐप्स = NSWorkspace() चलाना एप्लिकेशन के रूप में! [NSRunning अनुप्रयोग] ' – Chris

+0

@ क्रिस: आप सही हैं, स्विफ्ट 1.2 (एक्सकोड 6.3) के साथ बदल गया है, मुझे बताने के लिए धन्यवाद! –

1

यहाँ क्यों है: app (ऑब्जेक्टिव-सी में id) प्रकार AnyObject की है, और AnyObject पर कोई भी लुकअप करने से ऑब्जेक्ट पर विधि मौजूद नहीं होने की संभावना के कारण वैकल्पिकता की एक परत पेश करती है। localizedName स्वयं वैकल्पिक है, इसलिए आप वैकल्पिक के दो स्तरों के साथ समाप्त होते हैं: यदि ऑब्जेक्ट localizedName पर प्रतिक्रिया नहीं देता है, तो बाहरी स्तर शून्य है, और यदि 'localizedName' शून्य है तो आंतरिक शून्य है।

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