繁体   English   中英

添加新对象时,按继承属性对自定义对象的NSArray进行排序

[英]Sort NSArray of custom objects by inherited property when adding new object

类“ Person”由“ Employee”继承,而“ Employee”由“ EmployeeList”继承

在我的主模型中,我初始化一个新的Employee对象,设置firstNamelastName ,然后将EmployeeList addEmployeeEmployeeList

addEmployee方法中,我想按lastName对Employee对象的NSArray进行排序

这是我尝试过的方法,但未对列表进行排序。

#import "EmployeeList.h"

@interface EmployeeList()
@property (strong, nonatomic) NSMutableArray *employees;  // of Employee
@end


@implementation EmployeeList

- (NSMutableArray *)employees
{
    if (!_employees) _employees = [[NSMutableArray alloc] init];
    return _employees;
}

- (void)addEmployee:(Employee *)employee
{
    [self.employees addObject:employee];

    NSSortDescriptor *sortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                  ascending:YES
                                   selector:@selector(caseInsensitiveCompare:)];
    [self.employees sortedArrayUsingDescriptors:@[sortDescriptor]];

    _numberEmployees++;
}

主要型号:

EmployeeList *mgrList = [[EmployeeList alloc] init];

Employee *employee = [[Employee alloc] init];
employee.firstName = object[@"firstName"];
employee.lastName  = object[@"lastName"];
employee.phoneNumber = object[@"phoneNumber"];

[mgrList addEmployee:employee];

更改此:

[self.employees sortedArrayUsingDescriptors:@[sortDescriptor]];

至:

[self.employees sortUsingDescriptors:@[sortDescriptor]];

好的,您的代码需要重构:

#import "EmployeeList.h"

@interface EmployeeList()
@property (strong, nonatomic) NSMutableArray *employees;  // of Employee
@end


@implementation EmployeeList

//This is a more elegant solution to init
- (NSMutableArray *)employees
{
    dispatch_token_t token;
    dispatch_once(&token, ^{
        _employees = [NSMutableArray new];
    });
    return _employees;
}

- (void)addEmployee:(Employee *)employee
{
    [self.employees addObject:employee];

    NSSortDescriptor *sortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                  ascending:YES
                                   selector:@selector(caseInsensitiveCompare:)];

    //This return an array so if you don't take it you don't have any change.
    NSArray *newArray = [[self.employees copy] sortedArrayUsingDescriptors:@[sortDescriptor]];

    //Then you can remove and add again all the object to the NSMutableArray
    [self.employees removeAllObjects];
    [self.employees addObjectsFromArray:newArray];

    //This is not needed because you can access to this information by
    //[self.employees count]
    //_numberEmployees++;
}

要小心,因为您的自雇人士是易变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM