如何从NSMutableArray打印对象变量?

时间:2013-02-21 21:26:45

标签: ios objective-c

从我读过的内容NSMutableArray添加了对象。

如何在不将对象强制转换为Student的情况下从给定位置打印Student个对象变量。

我在Java中寻找类似ArrayList<Student>的内容,因此我可以轻松打印ArrayList.get(i).getNameArrayList.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]);

5 个答案:

答案 0 :(得分:2)

您发布的代码原样很好。 Objective-C / Cocoa与Java的类型集合没有对应关系。你需要投射结果。

实际上,你可以做一个小技巧:

NSLog(@"Value: %@", [myStudentRepo.studentRepository[0] valueForKey:@"name"]);

答案 1 :(得分:1)

您可以使用KVC(键值编码)访问对象的属性而不进行强制转换:

[[myStudentRepo.studentRepository objectAtIndex:0] valueForKey:@"name"];

请参阅:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BAJEAIEE

答案 2 :(得分:1)

您可以覆盖description课程中的debugDescriptionStudent

由于我没有组成你的学生,请允许以下例子直截了当:

// 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根据需要添加一个强制转换器。你也会在上述问题的答案中看到这种方法。

(此处没有代码,因为您可以在其他问题中找到所需的全部内容。)