什么是NSComparisonResult
和NSComparator
?
我见过一种类型定义,类似这样的:
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
它与函数指针有什么不同吗?
另外,我什至无法猜测^
符号的含义。
什么是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
and的对象obj2
,并返回一个NSComparisonResult
。
具体NSComparator
定义在Foundation Data Types 参考中。
要了解有关 C 模块的更多信息,请查看这篇 ADC 文章Blocks Programming Topics。
例子:
NSComparator compareStuff = ^(id obj1, id obj2) {
return NSOrderedSame;
};
NSComparisonResult compResult = compareStuff(someObject, someOtherObject);
雅各布的回答很好,但是要回答关于“这与函数指针有何不同?”的部分:
1) 块不是函数指针。Blocks 是 Apple 关于如何在 C/C++/Objective-C 中使函数成为一等公民的方法。它是 iOS 4.0 的新功能。
2) 为什么要引入这个奇怪的概念?事实证明,一流的功能在很多场景中都很有用,例如管理可以并行执行的工作块,如在 Grand Central Dispatch 中。除了 GCD,该理论非常重要,以至于整个软件系统都基于它。Lisp 是最早的之一。
3) 你会在许多其他语言中看到这个概念,但名称不同。例如,Microsoft .Net 有 lambda 和委托(与 Objective-C 委托无关),而最通用的名称可能是匿名函数或第一类函数。
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