ios*_*s85 12 arrays objective-c ios
我仍然是Objective-c的新手,我正在试图弄清楚这句话究竟在做什么.
[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)
我知道这allKeys是从我的字典中获取所有键.我知道这sortedArrayUsingSelector是在创建我的数组.然后我调用比较方法,这就是我迷失了这是做什么的?从apple上的文档中可以看出"返回一个NSComparisonResult值,指示接收者是否大于,等于或小于给定数量." 我不明白它是如何根据该方法进行排序的.
Joe*_*ets 22
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)
上面的代码使用您提供的选择器返回字典键的排序数组.选择器实际上是将在数组中排序的对象上调用的函数.在这种情况下,您的数组包含字符串,因此在实际的NSArray排序代码中将发生以下情况,
//...
[key1 compare:key2];
//..
Run Code Online (Sandbox Code Playgroud)
如果你传入一个不同的选择器让我们说@selector(randomFunction :)然后在排序代码中会发生以下情况
//..
[key1 randomFunction:key2];
//..
Run Code Online (Sandbox Code Playgroud)
由于NSString不响应选择器randomFunction,您将收到错误.如果您想创建自己的比较函数类型,则需要在数组包含的类中添加一个类别(在您的情况下是NSString的类别).
对数组进行排序的更好方法是使用块语句.
id mySort = ^(NSString * key1, NSString * key2){
return [key1 compare:key2];
};
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort];
Run Code Online (Sandbox Code Playgroud)
这是一个更好的方法是排序任何对象很容易做到.
id mySort = ^(MyObject * obj1, MyObject * obj2){
return [obj1.title compare:obj2.title];
};
NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort];
Run Code Online (Sandbox Code Playgroud)
- (NSComparisonResult)compare:
{
// if (value of firstObject) < (value of secondObject)
// return NSOrderedAscending
// else if (value of firstObject) == (value of secondObject)
// return NSOrderedSame
// else
// return NSOrderedDescending
}
Run Code Online (Sandbox Code Playgroud)