[英]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
对象,设置firstName
和lastName
,然后将EmployeeList
addEmployee
到EmployeeList
。
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.