7

Что такое NSComparisonResult и NSComparator?NSComparisonResult и NSComparator - что это?

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

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

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

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

ответ

22

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

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

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

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

И чтобы узнать больше о блоках C, ознакомьтесь с этой статьей АЦП Blocks Programming Topics.

Пример:

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

NSComparisonResult compResult = compareStuff(someObject, someOtherObject); 
+0

Большое спасибо, Джейкоб! Теперь я нашел учебники по блокам и узнал немного больше) – wh1t3cat1k

7

ответ Иакова хорошо, однако ответить на часть о «как это отличается от указателя функции?»:

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

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

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

-1
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 
Смежные вопросы