2014-09-10 9 views
22

साथ Objective-C में मैं एक NSArray इस बयान का उपयोग कर सॉर्ट कर सकते हैं:क्रमबद्ध NSArray sortedArrayUsingComparator

NSArray *sortedArray = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) { 
    return [p1.name compare:p2.name]; 
}]; 

मैं स्विफ्ट के साथ एक ही बयान पुन: पेश करने में असमर्थ हूँ। मैंने पाया कि Array का उपयोग कर रहा था।

उत्तर

35

आप या तो उपयोग Swift's built in sort functions या, चूंकि स्विफ्ट सरणी NSArray पर ब्रिज हो गई है, तो आप sortedArrayUsingComparator को सीधे स्विफ्ट से कॉल कर सकते हैं।

स्विफ्ट sorted समारोह का उपयोग करना:

var sortedArray = sorted(persons) { 
    (obj1, obj2) in 

    // The downcast to Person is only needed if persons is an NSArray or a Swift Array of AnyObjects 
    let p1 = obj1 as Person 
    let p2 = obj2 as Person 
    return p1.name < p2.name 
} 

या, NSArray के sortedArrayUsingComparator का उपयोग कर:

var sortedArray = persons.sortedArrayUsingComparator { 
    (obj1, obj2) -> NSComparisonResult in 

    let p1 = obj1 as Person 
    let p2 = obj2 as Person 
    let result = p1.name.compare(p2.name) 
    return result 
} 
+0

'NSComparisonResult' अब है' ComparisonResult'। – ThomasW

9

तो बस स्विफ्ट के साथ एक ही लिखने का प्रयास करें:

var sortedArray:NSArray = 
persons.sortedArrayUsingComparator(){(p1:AnyObject!, p2:AnyObject!) -> NSComparisonResult in 

    if (p1 as Person).name > (p2 as Person).name { 
     return NSComparisonResult.OrderedDescending 
    } 
    if (p1 as Person).name < (p2 as Person).name { 
     return NSComparisonResult.OrderedAscending 
    } 
    return NSComparisonResult.OrderedAscending 
} 

टेस्ट (खेल का मैदान):

class Person{ 
    var name:String? 
} 

var p1:Person = Person() 
p1.name = "a"  

var p3:Person = Person() 
p3.name = "c" 

var p2:Person = Person() 
p2.name = "b" 

var persons:NSArray = [p1,p3,p2] 

var sortedArray:NSArray = persons.sortedArrayUsingComparator(){ 

    (p1:AnyObject!, p2:AnyObject!) -> NSComparisonResult in 

    if (p1 as Person).name > (p2 as Person).name { 
     return NSComparisonResult.OrderedDescending 
    } 
    if (p1 as Person).name < (p2 as Person).name { 
     return NSComparisonResult.OrderedAscending 
    } 
    return NSComparisonResult.OrderedAscending 
    } 

for item:AnyObject in sortedArray{ 
    println((item as Person).name) 
} 

आउटपुट:

Optional("a") 
Optional("b") 
Optional("c") 
13

स्विफ्ट Array से बचने के लिए कोई ज़रूरत नहीं है।

यह NSArray के साथ दोनों दिशाओं में ब्रिज किया गया है, इसलिए अधिक प्रकार के सुरक्षित कोड के लिए केवल स्विफ्ट सरणी और पुल के साथ अपना काम करना सबसे अच्छा है जब ओबीजेसी एपीआई के साथ इंटरऑपरेक्ट करने के लिए आवश्यक हो। (और सबसे आयातित APIs में, स्विफ्ट स्वचालित रूप से [AnyObject] को NSArray बदल देता है, तो आप भी बहुत बार पाटने की जरूरत नहीं है।)

persons सरणी मान लिया जाये कि एक [AnyObject] आप अन्य एपीआई से मिल गया है, तो आप में कटौती कर सकते हैं पहली सरणी कास्टिंग द्वारा की अन्य उत्तर के प्रकार कास्टिंग रिश्तेदार राशि:

let sortedPersons = sorted(persons as [Person]) { $0.name < $1.name } 
// sortedPersons has inferred type [Person] 

इसके अतिरिक्त, क्योंकि आप केवल अपने Person वर्ग के एक विशिष्ट संपत्ति पर सॉर्ट करने के लिए एक तुलनित्र ब्लॉक का उपयोग कर रहे हैं, तो आप तरह उपयोग करने के लिए बेहतर कर सकता है वर्णनकर्ता:

let sortedPersons = (persons as NSArray).sortedArrayUsingDescriptors([ 
    NSSortDescriptor(key: "name", ascending: true) 
]) 

(persons as NSArray हिस्सा आवश्यक नहीं हो सकता है, तो persons एक ObjC एपीआई से आया है।)

कैसे Person वर्ग कार्यान्वित किया जाता है के आधार पर, वर्णनकर्ता साथ छँटाई बैकएंड पर एक अधिक कुशल प्रकार का उत्पादन कर सकते हैं। उदाहरण के लिए, यदि यह कोर डेटा प्रबंधित ऑब्जेक्ट है, तो डिस्क्रिप्टर के साथ सॉर्टिंग एक SQL क्वेरी उत्पन्न कर सकती है जो डेटाबेस में तेज़ी से निष्पादित करती है और थोड़ी मेमोरी का उपयोग करती है, जबकि तुलनित्र बंद करने के साथ क्रमबद्ध करने के लिए डेटाबेस से प्रत्येक ऑब्जेक्ट को तुरंत प्रत्येक के विरुद्ध बंद करने का मूल्यांकन करने की आवश्यकता होती है ।

+0

आपको बहुत धन्यवाद @rickster। यह मेरे लिए उपयोगी था। – Raja

+0

दूसरा एक मेरे लिए काम किया .. उल्टा !! – NSPratik

0

स्विफ्ट में आप नए दृष्टिकोण का उपयोग कर सकते हैं। सॉर्ट किए गए विधि का उपयोग करने की कोशिश करें इसके बजाय सॉर्टयूयूंगकंपेटर इस तरह ...

var sortedArray = results.sorted { 
    (obj1, obj2) -> Bool in 
    return obj1.count! > obj2.count! 
} 
0

मामले में आप कस्टम वस्तु है और तिथि के अनुसार क्रमबद्ध करना चाहते हैं

let sortedArray = self.posts.sorted { 
      (obj1, obj2) -> Bool in 
      return (obj1 as! PostModel).orderCancellionDate.compare((obj2 as! PostModel).orderCancellionDate) == .orderedDescending 
     }