【问题标题】:sortedArrayUsingSelector what is it doing?sortedArrayUsingSelector 它在做什么?
【发布时间】:2012-02-11 18:00:05
【问题描述】:

我还是 Objective-c 的新手,我正试图弄清楚这个语句到底在做什么。

[names allKeys] sortedArrayUsingSelector:@selector(compare:)];

我知道allKeys 正在从我的字典中获取所有键。我知道sortedArrayUsingSelector 正在对我正在创建的数组进行排序。然后我调用比较方法,这就是我迷失的地方这是在做什么?从苹果的文档中它说“返回一个 NSComparisonResult 值,该值指示接收器是大于、等于还是小于给定的数字。”我不明白它是如何基于该方法进行排序的。

【问题讨论】:

    标签: objective-c ios arrays


    【解决方案1】:
    NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    

    上面的代码使用您提供的选择器返回字典键的排序数组。选择器实际上是将在数组中排序的对象上调用的函数。在这种情况下,您的数组包含字符串,因此在实际的 NSArray 排序代码中会发生以下情况,

    //...
    [key1 compare:key2];
    //..
    

    如果你传入不同的选择器,比如说@selector(randomFunction:),那么在排序代码中会发生以下情况

    //..
    [key1 randomFunction:key2];
    //..
    

    由于 NSString 不响应选择器 randomFunction 你会得到一个错误。如果您想创建自己的比较函数类型,则需要向数组包含的类添加一个类别(在您的情况下是 NSString 的类别)。

    对数组进行排序的更好方法是使用块语句。

    id mySort = ^(NSString * key1, NSString * key2){
        return [key1 compare:key2];
    };
    
    
    NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort];
    

    这是一种更好的方法,因为它很容易对任何对象进行排序。

    id mySort = ^(MyObject * obj1, MyObject * obj2){
        return [obj1.title compare:obj2.title];
    };
    
    
    NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort];
    

    【讨论】:

      【解决方案2】:
      - (NSComparisonResult)compare:
      {
          // if (value of firstObject) < (value of secondObject)
              // return NSOrderedAscending
          // else if (value of firstObject) == (value of secondObject)
              // return NSOrderedSame
          // else
              // return NSOrderedDescending
      }
      

      【讨论】:

        【解决方案3】:

        您示例中的 -sortedArrayUsingSelector: 方法对数组中的对象调用 -compare: 方法。对于某些对象,Apple 已经实现了 -compare: 方法,例如,如果您阅读the NSString documentation,您会发现实现了 -compare: 方法。如果您在这些对象中实现了比较方法,您还可以在您自己的自定义对象上调用自定义比较方法。请注意,比较方法不一定非要调用-compare:,重要的只是返回值(NSComparisonResult)和方法接收的对象。

        【讨论】:

          【解决方案4】:

          新数组包含对接收数组元素的引用,而不是它们的副本。
          比较器消息被发送到数组中的每个对象,并将数组中的另一个对象作为其单个参数。
          例如,可以使用 NSString 类中声明的 caseInsensitiveCompare: 方法对 NSString 对象数组进行排序。假设 anArray 存在,可以通过这种方式创建数组的排序版本:

          NSArray *sortedArray =
               [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
          

          【讨论】:

            【解决方案5】:

            在这种情况下,您可能应该使用caseInsensitiveCompare:,因为您很可能对字符串数组(字典中的键)进行排序。

            您假设 sortedArrayUsingSelector 在某种程度上与代码的compare: 部分是分开的。不是这种情况。 compare: 用于对数组进行排序的选择器。

            排序方法会返回一个数组,其中每个元素在发送指定的选择器和数组中的下一个元素时都会给出正确的排序顺序。

            NSArray 如何实现这一点并不公开,但在根目录中,您定义的选择器用于比较数组中的对象对,其结果会告知它们在排序数组中的位置。

            【讨论】:

              猜你喜欢
              • 2023-03-26
              • 2013-07-27
              • 2015-12-31
              • 1970-01-01
              • 2010-09-20
              • 2016-06-02
              • 1970-01-01
              • 2022-08-20
              相关资源
              最近更新 更多