NSComparisonResult и NSComparator — что это такое?

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

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

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

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

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


person wh1t3cat1k    schedule 07.11.2010    source источник


Ответы (2)


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

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);
person Jacob Relkin    schedule 07.11.2010
comment
Большое спасибо, Яков! Теперь я нашел туториалы по блокам и узнал немного больше) - person wh1t3cat1k; 07.11.2010

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

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

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

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

person whitneyland    schedule 15.04.2011