यदि आप केवल एक सरणी को सॉर्ट कर रहे हैं NSNumbers
, तो आप उन्हें 1 कॉल के साथ सॉर्ट कर सकते हैं:
[arrayToSort sortUsingSelector: @selector(compare:)];
वह काम करता है क्योंकि सरणी ( NSNumber
ऑब्जेक्ट्स) में ऑब्जेक्ट तुलना पद्धति को लागू करते हैं। आप एक ही काम कर सकते हैंNSString
वस्तुओं के , या यहां तक कि कस्टम डेटा ऑब्जेक्ट्स की एक सरणी के लिए जो एक तुलना विधि को लागू करते हैं।
यहाँ कुछ उदाहरण कोड तुलनित्र ब्लॉक का उपयोग कर रहा है। यह शब्दकोशों की एक सरणी को सॉर्ट करता है जहां प्रत्येक शब्दकोश में एक कुंजी "सॉर्ट_की" में एक नंबर शामिल होता है।
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
if (value1 > value2)
{
return (NSComparisonResult)NSOrderedDescending;
}
if (value1 < value2)
{
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
उपरोक्त कोड प्रत्येक प्रकार की कुंजी के लिए पूर्णांक मान प्राप्त करने और उनकी तुलना करने के कार्य के माध्यम से जाता है, इसे कैसे करना है। चूंकि NSNumber
ऑब्जेक्ट एक तुलना पद्धति को लागू करते हैं, इसलिए इसे बहुत सरल रूप से फिर से लिखा जा सकता है:
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
return [key1 compare: key2];
}];
या तुलनित्र का शरीर 1 पंक्ति तक भी डिस्टिल्ड हो सकता है:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
मैं सरल कथनों और बहुत सारे अस्थायी चरों को पसंद करता हूं क्योंकि कोड पढ़ना आसान है, और डीबग करना आसान है। कंपाइलर वैसे भी अस्थायी चरों को दूर करता है, इसलिए ऑल-इन-वन लाइन संस्करण का कोई लाभ नहीं है।