2014-06-30 20 views
6

ऑब्जेक्टिव-सी में, यदि मैं निम्नलिखित संपत्ति थी:स्विफ्ट: वैकल्पिक सरणी गिनती

@property (strong, nonatomic) NSArray * myArray; 

myArray में वस्तुओं के एक नंबर वापस जाने के लिए एक विधि दिखाई देगा:

- (NSInteger) numberOfObjectsInMyArray 
{ 
    return [self.myArray count]; 
} 

यह होगा सरणी में ऑब्जेक्ट्स की संख्या यापर वापस लौटें;

सबसे अच्छा बराबर मैं स्विफ्ट में ऐसा करने के लिए के बारे में सोच सकता है:

var myArray: Array<String>? 

func numberOfObjectsInMyArray() -> Int 
{ 
    return myArray ? myArray!.count : 0 
} 

तो वैकल्पिक सरणी जाँच एक मूल्य के होते हैं, और यदि ऐसा है तो सरणी खोलने और उस मान, अन्यथा 0.

वापसी

क्या यह करने का यह सही तरीका है? या क्या कुछ आसान है?

+2

शायद वैकल्पिक 'Int?' वापस कर दें? –

+0

वैकल्पिक 'Int' आवश्यक नहीं है, क्योंकि यहां हर मामले में मूल्य वापसी मूल्य है। – holex

+0

'मेरा ऐर्रे? .उंट' वापस लौटें ... हाँ, निश्चित रूप से छोटा। लेकिन निश्चित रूप से उस परिणाम पर निर्भर करता है जहां एक वैकल्पिक अनुमति है। 'समारोह numberOfSectionsInTableView में कोई अच्छा (tableView: UITableView) -> Int' उदाहरण –

उत्तर

6

यह आसान तरीका दिखता है।

उद्देश्य-सी कोड केवल छोटा है क्योंकि nil भी 0 का एक रूप है, जो सी-आधारित भाषा है।

चूंकि तेजी से टाइप किया गया है, इसलिए आपके पास इतना शॉर्टेंड नहीं है। इस विशिष्ट मामले में इसे थोड़ा और प्रयास की आवश्यकता होती है, लेकिन आम तौर पर यह आपको ढीले टाइपिंग के कारण सिरदर्द के अधिकांश बचाता है।


विशिष्ट मामले के बारे में, क्या सरणी को पहले स्थान पर वैकल्पिक बनाने का कोई कारण है? आप बस एक खाली सरणी हो सकती है। कुछ इस तरह आप के लिए काम कर सकते हैं:

var myArray: Array<String> = [] 

func numberOfObjectsInMyArray() -> Int { 
    return myArray.count 
} 

(Source for this information)

+0

मुझे यह पसंद है! और स्विफ्ट सुनिश्चित करेगा कि myArray हमेशा एक मूल्य है। बहुत धन्यवाद। –

+0

क्योंकि एक शून्य मान एक सरणी इंगित करता है जो 0 गिनती की सरणी बनाम सेट नहीं किया गया है। – altagir

3

कैसे वापसी मान के लिए optional का उपयोग कर के बारे में?

var myArray: Array<String>? 

func numberOfObjectsInMyArray() -> Int? { 
    return myArray?.count 
} 

मुझे लगता है कि यह तरीका सुरक्षित है।

(Source for this information)

+0

धन्यवाद @ किंग-विज़ार्ड। –

25

nil coalescing operator का उपयोग करें।

को एप्पल प्रलेखन अनुसार:

शून्य कोलेसिंग ऑपरेटर (एक ?? ख) एक वैकल्पिक एक unwraps अगर उसमें कोई मान है, या एक डिफ़ॉल्ट मान देता है ख अगर एक नहीं के बराबर है।

तो अपने समारोह ऐसा दिखाई दे सकता:

func numberOfObjectsInMyArray() -> Int { 
     return (myArray?.count ?? 0) 
    } 

मैं (यह देखने के लिए एक गिनती के साथ एक सरणी है की तरह कर रही है जैसे अन्य लोगों के साथ सहमत यह कारणों की एक संख्या के लिए एक बुरा विचार हो सकता है कि "0" जब वास्तव में कोई सरणी नहीं है) लेकिन हे, यहां तक ​​कि बुरे विचारों को कार्यान्वयन की आवश्यकता है।

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

तो मैं इस जोड़ रहा।

मैं स्विफ्ट में NSOutlineViewDataSource प्रोटोकॉल को लागू कर रहा हूँ। प्रोटोकॉल के लिए आवश्यक कार्यों में से एक है:

optional func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int

कि समारोह की आवश्यकता है कि आप item पैरामीटर के बच्चों की संख्या में लौट आते हैं। मेरे कोड में, यदि आइटम में कोई बच्चा है, तो उन्हें एक सरणी में संग्रहीत किया जाएगा, var children: [Person]?

मैं उस सरणी को तब तक प्रारंभ नहीं करता जब तक कि मैं वास्तव में सरणी में कोई बच्चा नहीं जोड़ता।

दूसरे शब्दों में, समय है कि मैं NSOutlineView करने के लिए डेटा उपलब्ध कराने रहा हूँ पर, childrennil हो सकता है या यह आबादी किया जा सकता है, या यह एक बार आबादी किया जा सकता था लेकिन बाद में यह से हटा सभी वस्तुओं, था जो इसे मामले में nil नहीं होगा लेकिन यह count0 होगा। NSOutlineView परवाह नहीं करता है, तो childrennil है - सभी यह जानना चाहता है कि कितने पंक्तियों यह item के children प्रदर्शित करने के लिए की आवश्यकता होगी है।

तो, childrennil वापस लौटने के लिए इस स्थिति में यह सही अर्थ है। फ़ंक्शन को कॉल करने का एकमात्र कारण यह निर्धारित करना है कि NSOutlineView की कितनी पंक्तियों की आवश्यकता होगी। यह परवाह नहीं करता है कि उत्तर 0 है क्योंकि children शून्य है या क्योंकि यह खाली है।

return (children?.count ?? 0) मैं क्या जरूरत है क्या करेंगे। यदि childrennil है तो यह 0 वापस करेगा। अन्यथा यह count लौटाएगा। उत्तम!

+0

ओपी (सबसे अच्छा जवाब) द्वारा बताए गए अनुसार समस्या का सबसे साफ समाधान इस जवाब में चित्रित शून्य सहकारी ऑपरेटर का उपयोग है।आप एपीआई विकल्पों पर सवाल कर सकते हैं, लेकिन विरासत कोड के लिए, यह एक अलग जानवर है। –

+0

एक अच्छा जवाब, धन्यवाद! अगर मैं केवल 2 विजेताओं को चुन सकता हूं ... –

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