objective-c - sortedArrayUsingSelector 它在做什么?

标签 objective-c ios arrays

我对 objective-c 还是个新手,我想弄清楚这条语句到底在做什么。

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

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

最佳答案

NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];

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

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

如果你传入一个不同的选择器让我们说@selector(randomFunction:) 然后在排序代码中会发生以下情况

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

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

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

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];

关于objective-c - sortedArrayUsingSelector 它在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242588/

相关文章:

ios - 当单元格离开屏幕时,Tableview 单元格内容会更改

objective-c - 使用字典值动态填充对象属性

iphone - 如何在iPhone中后台播放多首歌曲

javascript - 如何使用 lodash 从较大数组内的对象中获取数组?

javascript - Ramda,检查(过滤)字符串数组是否包含子字符串

我可以在 C99 中使用数组作为函数参数吗?

ios - 如何获取时区及其各自的偏移量以显示在表格 View 上?

objective-c - 从使用 UIButton 元素注册的 IBAction 中删除 UIView

ios - 为什么 NSArray 的对象在 ARC 模式下不调用 dealloc 方法?

objective-c - 委托(delegate)属性未设置?