2014-07-22 3 views
8

मैं निम्नलिखित मॉडल है:वैकल्पिक प्रकार 'Int?' का मूल्य अनचाहे नहीं; क्या आप '!' का उपयोग करना चाहते थे या '?'?

var word: Word? 

, लेकिन अगर मैं ऐसा करने की कोशिश:

class Word: NSManagedObject { 
    @NSManaged var definitions: NSSet 
} 

फिर, मेरे विचार नियंत्रकों में से एक में, मैं निम्नलिखित संपत्ति है

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 
{ 
    return self.word?.definitions.count 
} 

Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

:

मैं कोई त्रुटि मिलती है

documentation के अनुसार, वैकल्पिक चेनिंग कॉल का मान भी वैकल्पिक है, इसलिए .count को एक वैकल्पिक Int वापस करना चाहिए। इसलिए मैंने इसे अनचाहे करने की कोशिश की:

return self.word?.definitions.count! 

लेकिन फिर भी वही त्रुटि होती है। ऐसा करने का सही तरीका क्या है?

+0

मैं इसे कुछ वापस कर दूंगा जैसे 'self.word? .definitions.count ?? 0' –

उत्तर

12

समस्या संचालन का क्रम है। ऐसा करने का सबसे साफ तरीका वैकल्पिक चेनिंग को रोकना होगा (यदि आप वास्तव में शून्य मामले को संभालना नहीं चाहते हैं)। अन्यथा

return self.word ? self.word!.definitions.count : 0 

, आप के रूप में अच्छी तरह से एक परोक्ष unwrapped वैकल्पिक रूप word घोषित करने और नहीं करने के लिए हो सकता है:

return self.word!.definitions.count 

लेकिन मैं सुरक्षा के लिए ऐसा करने की सलाह देते हैं:

if let actualWord = self.word { 
    return actualWord.definitions.count 
} 
else { 
    return 0 
} 

या भी कम इसके बारे में चिंता करें:

var word: Word! 

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 
{ 
    return self.word.definitions.count 
} 
+1

वैसे मैं इसे एक स्पष्ट रूप से अनचाहे वैकल्पिक के रूप में घोषित नहीं कर सकता क्योंकि शब्द पहली बार लोड होने पर और तालिका फिर से लोड होने पर शब्द शून्य हो सकता है। तो मुझे लगता है कि मुझे आपका दूसरा सुझाव देना है। क्या वास्तव में कोई दूसरा रास्ता नहीं है? उद्देश्य-सी में 1 लाइनर क्या था अब स्विफ्ट के साथ 6 लाइनें हैं :( – Snowman

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