2016-08-20 12 views
5

मैं उनके 'प्रमुख' बूलियन संपत्ति के द्वारा दुकान वस्तुओं की इस सरणी सॉर्ट कर सकते हैं बिना उनके वैकल्पिक बूलियन संपत्ति से वस्तुओं की एक सरणी सॉर्ट, लेकिन कैसे मैं सुरक्षित रूप से पहले 'प्रमुख' संपत्ति उपहार में कर सकते हैं?तेज - बल unwrapping

let flagshipStores = self.stores.sort { 
    $0.flagship! && !$1.flagship! 
} 
+0

मैं के बारे में है कि क्या आप वास्तव में एक "तीसरा राज्य" की जरूरत है लगता है कि अपने डिजाइन में एक ** द्विआधारी ** प्रकार के (एक वैकल्पिक बूल)? – vadian

+0

दुर्भाग्यवश, यह मेरा डिज़ाइन नहीं है। मैं एक JSON ऑब्जेक्ट पार्स कर रहा हूं जहां फ्लैगशिप सत्य, गलत, या प्रदान नहीं किया जा सकता है। –

+0

क्या आप * प्रदान नहीं किए गए * झूठे के रूप में व्यवहार कर सकते हैं? – vadian

उत्तर

7
let flagshipStores = self.stores.sort { 
    guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false } 
    return flagship0 && !flagship1 
} 
+1

खोल वहाँ एक बग यहाँ है है। यदि केवल एक ही नहीं के बराबर है, इस कोड को रिटर्न 'असत्य' है, लेकिन यह (शून्य && $ 1.flagship! = शून्य $ 0.flagship ==) लौटाना चाहिए (यदि आप पहले गैर-शून्य सॉर्ट करने के लिए नहीं के बराबर चाहते हैं)। –

+0

धन्यवाद! यह अच्छा काम किया है। – Raja

1

कैसे के बारे में: यदि मूल्य नहीं के बराबर नहीं है और सच है

$0.flagship == true && $1.flagship != true 

बाईं ओर सफल होगा, सही पक्ष सफल होगा अगर यह मान शून्य या गलत है।

3

यहां एक और दृष्टिकोण है।

आप flatMap का उपयोग कर सकते हैं जो nil ऑब्जेक्ट्स को हटा देगा और मौजूद हैं जो अनचाहे हैं। फिर, बल खोलना तरह करने के लिए सुरक्षित हो जाएगा:

let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort { 
    $0.flagship! && !$1.flagship! 
} 

इस सरणी से एक nil प्रमुख के साथ दुकानों को हटा देगा।

4

एक और दृष्टिकोण: Bool? को Int में बदलें, फिर Int एस की तुलना करें। आप कैसे एक nil मूल्य nil मूल्यों गैर की तुलना में निर्दिष्ट करने के लिए मिलता है।

stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) } 

आप nil बनाने के लिए एक ही पैटर्न का उपयोग कर सकते हैं:

stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) } 

यह दोनों false और true के बाद nil मूल्यों सॉर्ट करता:

उदाहरण के लिए, यह दोनों false और true से पहले nil मूल्यों पर क्रमबद्ध true या false के समान की तुलना करें। यह आप पर निर्भर करता है।