【问题标题】:NSComparisonResult and NSComparator - what are they?NSComparisonResult 和 NSComparator - 它们是什么?
【发布时间】:2010-11-07 15:07:18
【问题描述】:

NSComparisonResultNSComparator 是什么?

我见过一种类型定义,类似这样的:

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

它和函数指针有什么不同吗?

另外,我什至无法猜测^ 符号的含义。

【问题讨论】:

    标签: iphone objective-c ios function-pointers objective-c-blocks


    【解决方案1】:

    ^ 表示块类型,在概念上类似于函数指针。

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

    这意味着NSComparator 类型是一个,它接收两个id 类型的对象,分别称为obj1obj2,并返回一个NSComparisonResult

    具体地NSComparatorFoundation Data Types reference中定义。

    要了解有关 C 模块的更多信息,请查看这篇 ADC 文章 Blocks Programming Topics

    例子:

    NSComparator compareStuff = ^(id obj1, id obj2) {
       return NSOrderedSame;
    };
    
    NSComparisonResult compResult = compareStuff(someObject, someOtherObject);
    

    【讨论】:

    • 非常感谢,雅各布!现在我找到了关于 Blocks 的教程并学到了更多)
    【解决方案2】:

    Jacob 的回答很好,但是要回答关于“这与函数指针有何不同?”的部分:

    1) 块不是函数指针。 Blocks 是 Apple 关于如何在 C/C++/Objective-C 中使函数成为一等公民的方法。它是 iOS 4.0 的新功能。

    2) 为什么要引入这个奇怪的概念?事实证明,一流的功能在很多场景中都很有用,例如管理可以并行执行的工作块,如在 Grand Central Dispatch 中。除了 GCD,该理论非常重要,以至于整个软件系统都基于它。 Lisp 是最早的之一。

    3) 您会在许多其他语言中看到这个概念,但名称不同。例如,Microsoft .Net 有 lambda 和委托(与 Objective-C 委托无关),而最通用的名称可能是匿名函数或 first class functions

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2016-10-24
        • 2022-11-04
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 2022-08-13
        • 2011-09-30
        • 1970-01-01
        • 2013-12-02
        相关资源
        最近更新 更多