سؤال

ما هو NSComparisonResult و NSComparator?

لقد رأيت واحدة من التعريفات النوعية ، شيء من هذا القبيل:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

هل هو مختلف عن مؤشر الوظيفة؟

أيضا ، لا يمكنني حتى تخمين ما ^ الرمز يعني.

هل كانت مفيدة؟

المحلول

^ يدل نوع الكتلة, ، مماثلة في مفهوم مؤشر الوظيفة.

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
//          ^                      ^                ^
//   return type of block      type name       arguments

هذا يعني أن النوع NSComparator هو الكتلة يأخذ في كائنين من النوع id اتصل obj1 و obj2, ، ويعيد NSComparisonResult.

خاصة NSComparator تم تعريفه في مرجع أنواع بيانات الأساس.

ولتعلم المزيد حول كتل C ، تحقق من مقالة ADC هذه يمنع موضوعات البرمجة.

مثال:

NSComparator compareStuff = ^(id obj1, id obj2) {
   return NSOrderedSame;
};

NSComparisonResult compResult = compareStuff(someObject, someOtherObject);

نصائح أخرى

إجابة يعقوب جيدة ، ولكن الإجابة على الجزء حول "كيف يختلف هذا عن مؤشر الوظيفة؟":

1) كتلة ليس مؤشر وظيفة. الكتل هي تناول Apple حول كيفية جعل الوظائف من الدرجة الأولى المواطنين في C/C ++/Objective-C. إنه جديد على iOS 4.0.

2) لماذا تقديم هذا المفهوم الغريب؟ تبين أن وظائف الدرجة الأولى مفيدة في عدد قليل من السيناريوهات ، على سبيل المثال إدارة أجزاء العمل التي يمكن تنفيذها بالتوازي ، كما في Grand Central Dispatch. ما وراء GCD ، النظرية مهمة بما يكفي لوجود أنظمة برامج كاملة حولها. كان لايس واحد من أوائل.

3) سترى هذا المفهوم في العديد من اللغات الأخرى ، ولكن بأسماء مختلفة. على سبيل المثال ، لدى Microsoft .NET Lambdas ومندوبون (لا علاقة له بمندوبين الهدفين) ، في حين أن الأسماء الأكثر واقعية هي على الأرجح وظائف مجهولة أو وظائف الدرجة الأولى.

NSComparisonResult comparisionresult;
NSString * alphabet1;
NSString * alphabet2;


// Case 1

alphabet1 = @"a";
alphabet2 = @"A";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedSame)
    NSLog(@"a and a are same. And the NSComparisionResult Value is %ld \n\n", comparisionresult);
//Result: a and a are same. And the NSComparisionResult Value is 0

// Case 2
alphabet1 = @"a";
alphabet2 = @"B";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedAscending)
    NSLog(@"a is greater than b. And the NSComparisionResult Value is %ld \n\n", comparisionresult);
//Result: a is greater than b. And the NSComparisionResult Value is -1

// Case 3
alphabet1 = @"B";
alphabet2 = @"a";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedDescending)
    NSLog(@"b is less than a. And the NSComparisionResult Value is %ld", comparisionresult);

//Result: b is less than a. And the NSComparisionResult Value is 1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top