我创建了具有属性的简单类Student
@property (strong,nonatomic) NSString* firstname;
@property (strong,nonatomic) NSString* lastname;
@property (strong,nonatomic) NSDate* dateOfBirth;
@property (assign,nonatomic) NSInteger index;
之后,我创建了这个类的任何对象,给它起firstname,lastname,date和index,将它们全部添加到self.InitialStudentsArray中。并按dateOfBirth开始排序:
NSSortDescriptor* descriptorDate=[[NSSortDescriptor alloc]initWithKey:@"dateOfBirth" ascending:YES];
NSArray* descArray=[NSArray arrayWithObjects:descriptorDate, nil];
[self.InitialStudentsArray sortUsingDescriptors:descArray];
所以,结果很奇怪。排序前和排序后的数组有不同的项目顺序,但根本没有按日期排序。
before sort (
"46 Alex Dupel 25 10 1991",
"236 Ivan Evstegneev 20 09 1980",
"179 Hugo Igonin 03 02 1992",
"189 Alexey Boronenko 06 11 1978" )
after sort (
"236 Ivan Evstegneev 20 09 1980",
"179 Hugo Igonin 03 02 1992",
"189 Alexey Boronenko 06 11 1978",
"46 Alex Dupel 25 10 1991" )
与firstname和lastname相同(即使使用选择器:
NSSortDescriptor* descriptorLastname=[[NSSortDescriptor alloc]initWithKey:@"lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
它只适用于属性" index",即NSInteger。
我做了其他事情,我创建的数组只包含来自student.dateOfBirth的日期,并使用keyname self对其进行排序。它的工作原理!另一个实验 - 我使用键" dateOfBirth"创建了一系列字典。并按键名称排序@" dateOfBirth"它也有效!
我知道其他方法是实时sortUsingComparator,但为什么这个方法不能处理日期和属性中的字符串?
UPD 哦,伙计们,这是我的错。我很欣赏你的所有答案,他们把我推到了哪里,在哪里搜索错误。当我发现它时,我感到非常惭愧。绝对愚蠢的错误。如果您对此感兴趣,我会用这种方式初始化学生:
- (instancetype)init
{
self = [super init];
if (self) {
self.firstname=[self getFirstname];
self.lastname=[self getLastname];
self.dateOfBirth=[self getDateOfBirth];
}
return self;
}
-(NSString*) getFirstname {//some code...arrayOfFirstames...name=arc4random()...}
即。我偶尔会重新定义用于设置属性的getter。所有这三个。所以,每当我对数组进行排序时,每次都会采用新值。 谢谢。
答案 0 :(得分:0)
你可能错了另一件事,SortDescriptors可以正常使用字符串,这里有一个例子:
NSArray *people = @[@{@"name": @"Ivan"},@{@"name": @"Hugo"},@{@"name": @"Alexey"},@{@"name": @"Alex"}];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sorts = @[sort];
NSArray *orderedArray = [people sortedArrayUsingDescriptors:sorts];
NSLog(@"Show orderedArray: %@",[orderedArray description]);
在控制台中退出:
2014-11-14 20:19:45.377 pro[1366:60b] Show orderedArray: (
{
name = Alex;
},
{
name = Alexey;
},
{
name = Hugo;
},
{
name = Ivan;
}
)
我认为在sortedArrayUsingDescriptor方法之前和之后记录数组是个好主意。
你好。我再次做了同样的事情,使用自定义类这是标题:
#import <Foundation/Foundation.h>
@interface CustomClass : NSObject
@property (nonatomic, strong) NSString *name;
@end
实施(.m)是空白的,我已经完成了:
CustomClass *ivan = [[CustomClass alloc] init];
ivan.name = @"Ivan";
CustomClass *hugo = [[CustomClass alloc] init];
hugo.name = @"Hugo";
CustomClass *alexey = [[CustomClass alloc] init];
alexey.name = @"Alexey";
CustomClass *alex = [[CustomClass alloc] init];
alex.name = @"Alex";
NSArray *people = @[ivan,hugo,alexey,alex];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sorts = @[sort];
NSArray *orderedArray = [people sortedArrayUsingDescriptors:sorts];
NSLog(@"Show orderedArray:");
for (CustomClass *people in orderedArray) {
NSLog(@"%@\n",people.name);
}
同样,退出控制台是:
2014-11-14 22:38:13.297 pro[1406:147113] Show orderedArray:
2014-11-14 22:38:13.298 pro[1406:147113] Alex
2014-11-14 22:38:13.298 pro[1406:147113] Alexey
2014-11-14 22:38:13.298 pro[1406:147113] Hugo
2014-11-14 22:38:13.298 pro[1406:147113] Ivan
sortDescriptors和property没有任何问题。最好