簡體   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