NSSortDescriptor错误地排序日期和字符串,它们是自定义类的属性,但正确排序整数

时间:2014-11-14 18:56:26

标签: ios objective-c nsdate xcode6 nssortdescriptor

我创建了具有属性的简单类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。所有这三个。所以,每当我对数组进行排序时,每次都会采用新值。 谢谢。

1 个答案:

答案 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没有任何问题。最好