简体   繁体   English

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

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

Class "Person" is inherited by "Employee" which is inherited by "EmployeeList" 类“ Person”由“ Employee”继承,而“ Employee”由“ EmployeeList”继承

In my main model I initialize a new Employee object, setting the firstName and lastName , and then addEmployee to an EmployeeList . 在我的主模型中,我初始化一个新的Employee对象,设置firstNamelastName ,然后将EmployeeList addEmployeeEmployeeList

Inside the addEmployee method I want to sort the NSArray of Employee objects by lastName addEmployee方法中,我想按lastName对Employee对象的NSArray进行排序

Here is what I've tried but it's not sorting the list. 这是我尝试过的方法,但未对列表进行排序。

#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++;
}

Main model: 主要型号:

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

Change this: 更改此:

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

to: 至:

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

Ok your code need a refactor: 好的,您的代码需要重构:

#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++;
}

Be careful because you self.employees is mutable. 要小心,因为您的自雇人士是易变的。

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

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