NSComparisonResult
とは何NSComparator
ですか?
タイプ定義の1つ、次のようなものを見てきました。
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
関数ポインタと何か違いはありますか?
^
また、記号の意味すら推測できません。
NSComparisonResult
とは何NSComparator
ですか?
タイプ定義の1つ、次のようなものを見てきました。
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
関数ポインタと何か違いはありますか?
^
また、記号の意味すら推測できません。
^
概念的には関数ポインタに似たブロックタイプを示します。
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
// ^ ^ ^
// return type of block type name arguments
これは、タイプNSComparator
がとと呼ばれるタイプの2つのオブジェクトを受け取り、。を返すブロックであることを意味します。id
obj1
obj2
NSComparisonResult
具体的には、 FoundationDataTypesリファレンスNSComparator
で定義されています。
また、Cブロックの詳細については、このADCの記事「ブロックプログラミングトピック」を参照してください。
例:
NSComparator compareStuff = ^(id obj1, id obj2) {
return NSOrderedSame;
};
NSComparisonResult compResult = compareStuff(someObject, someOtherObject);
ジェイコブの答えは良いですが、「これは関数ポインタとどう違うのですか?」という部分に答えるには:
1)ブロックは関数ポインタではありません。ブロックは、C / C ++/Objective-Cで関数を第一級市民にする方法に関するAppleの見解です。iOS4.0の新機能です。
2)なぜこの奇妙な概念を導入するのですか?ファーストクラス関数は、Grand Central Dispatchのように、並行して実行できる作業のチャンクを管理するなど、かなりの数のシナリオで役立つことがわかりました。GCDを超えて、理論はそれをベースにしたソフトウェアシステム全体が存在するほど重要です。Lispは最初の1つでした。
3)この概念は他の多くの言語でも見られますが、名前は異なります。たとえば、Microsoft .Netにはラムダとデリゲート(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