从我读过的内容NSMutableArray
添加了对象。
如何在不将对象强制转换为Student
的情况下从给定位置打印Student
个对象变量。
我在Java中寻找类似ArrayList<Student>
的内容,因此我可以轻松打印ArrayList.get(i).getName
,ArrayList.get(i).getPrice
。
StudentRepository* myStudentRepo = [[StudentRepository alloc]init];
Student* myStudent = [[Student alloc]init];
myStudent.name = @"John";
// add a Student to the NSMutableArray
[myStudentRepo.studentRepository addObject:myStudent];
NSLog(@"Value: %@", myStudentRepo.studentRepository);
for(Student* myStudentItem in myStudentRepo.studentRepository)
{
NSLog(@"Value: %@", myStudentItem.name);
}
// print the Student from a given position
NSLog(@"Value: %@", [(Student*)[myStudentRepo.studentRepository objectAtIndex:0] name]);
答案 0 :(得分:2)
您发布的代码原样很好。 Objective-C / Cocoa与Java的类型集合没有对应关系。你需要投射结果。
实际上,你可以做一个小技巧:
NSLog(@"Value: %@", [myStudentRepo.studentRepository[0] valueForKey:@"name"]);
答案 1 :(得分:1)
您可以使用KVC(键值编码)访问对象的属性而不进行强制转换:
[[myStudentRepo.studentRepository objectAtIndex:0] valueForKey:@"name"];
答案 2 :(得分:1)
您可以覆盖description
课程中的debugDescription
或Student
:
由于我没有组成你的学生,请允许以下例子直截了当:
// could also be -(NSString*)debugDescription
- (NSString *)description {
return [NSString stringWithFormat:@"Prop1: %@ \nIntVal1: %d\nfloatVal1 = %3.2f", self.prop1, self.intVal1, self.floatval1];
}
但是,对于大而复杂的物体来说,这很乏味。
答案 3 :(得分:1)
你可以使用这样的东西
[(Student*)myStudentRepo.studentRepository[0] name];
或者您可以像这样覆盖学生的描述: 在Student.m中添加:
-(NSString *)description{
return [NSString stringWithFormat:@"Student Name:%@", self.name];
}
每当您需要打印学生时,只需输入:
NSLog(%@, student);
答案 4 :(得分:1)
如果您希望确保您的集合实际上只包含Student
个对象,则可以执行此操作,相当于Java的参数集合。有关词典的解决方案,请参阅this question,阵列解决方案类似。您可以将已接受的解决方案与键入的getter&amp;设置者以避免任何演员阵容。
或者,如果您实际上并不担心确保只能添加Student
个对象,您可以编写一个扩展或类别来添加一个类型化的getter或setter - 这只是调用标准setter或getter根据需要添加一个强制转换器。你也会在上述问题的答案中看到这种方法。
(此处没有代码,因为您可以在其他问题中找到所需的全部内容。)