NSComparisonResult и NSComparator - что это? - PullRequest
7 голосов
/ 07 ноября 2010

Что такое NSComparisonResult и NSComparator?

Я видел одно из определений типов, что-то вроде этого:

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

Отличается ли он от указателя функции?

Кроме того, я даже не могу догадаться, что означает символ ^.

Ответы [ 3 ]

22 голосов
/ 07 ноября 2010

^ означает тип блока , аналогичный по концепции указателю на функцию.

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

Это означает, что тип NSComparator представляет собой блок , который принимает два объекта типа id с именами obj1 и obj2 и возвращает NSComparisonResult.

В частности, NSComparator определено в справочнике Foundation Data Types .

А чтобы узнать больше о блоках C, ознакомьтесь с этой статьей АЦП Темы программирования блоков .

Пример: * * тысяча двадцать-пять

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

NSComparisonResult compResult = compareStuff(someObject, someOtherObject);
7 голосов
/ 15 апреля 2011

Ответ Джейкоба хорош, однако ответить на часть о том, «как это отличается от указателя функции?»:

1) Блок является , а не указателем функции. Блоки - это то, как Apple пытается сделать функции первоклассными гражданами в C / C ++ / Objective-C. Это ново для iOS 4.0.

2) Зачем вводить эту странную концепцию? Оказывается, функции первого класса полезны в довольно многих сценариях, например, управление частями работы, которые могут выполняться параллельно, как в Grand Central Dispatch. Помимо GCD, теория настолько важна, что вокруг нее существуют целые программные системы. Лисп был одним из первых.

3) Вы увидите эту концепцию на многих других языках, но под другими именами. Например, Microsoft .Net имеет лямбда-выражения и делегаты (никак не связанные с делегатами Objective-C), в то время как наиболее общими именами являются, вероятно, анонимные функции или функции первого класса .

0 голосов
/ 15 января 2016
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
...