1

我编写了一个具有属性的类,我想将这个类的实例添加到一个可变数组中,然后我想设置实例的 num 属性。但我不知道正确的语法。请告诉我执行此操作的正确语法或方法。

@interface ClassA : NSObject

@property int num;

-(void) method;
+(id) getClassAObj:(int)number;

@end
--------------------------------
#import "ClassA.h"

@implementation ClassA

@synthesize num;

-(void) method{
    NSLog(@"ClassA method Called");
}
+(id) getClassAObj:(int)number {

    ClassA *obj = [[ClassA alloc] init];
    obj.num = number;
    return obj;

}

@end
-----------------------

现在主要我想手动设置 num 属性,但我不知道什么是正确的语法

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");

        NSMutableArray *array = [NSMutableArray arrayWithObjects:
                                [ClassA getClassAObj:9],
                                [ClassA getClassAObj:4], nil];
        NSLog(@"%i",[[array objectAtIndex:0] num]);
        NSLog(@"%i",[array[1] num]);
        //array[1].num = 3;              <--- Help needed here
        //[[array[1]]num 3];             <--- this is also not correct syntax

        NSLog(@"%i",[array[1] num]);

    }
    return 0;
}

我不知道我的语法是否错误,或者可能无法在数组中设置对象的属性

4

2 回答 2

7

干得好:

ClassA *anObject = array[<index>];
[anObject setNum:<yourNumber>];

您也可以使用该[<array> objectAtIndex:<index>]方法,但以上是较新的方法。

祝你好运!

编辑:

如果您想验证对象(因此它不会崩溃,但也不会按预期工作),您的代码可能如下所示:

id anObject = array[<index>];
if ([anObject isKindOfClass:[NSClassFromString(@"ClassA")]]) {
    [(ClassA *)anObject setNum:<number>];
}

如果您想验证确切的消息(在这种情况下为 setter),您应该检查对象是否响应此选择器。当您有不同类的对象但它们都响应消息时,这很有用。它看起来像这样:

id anObject = array[<index>];
if ([anObject respondsToSelector:@selector(setNum:)) {
    [anObject setNum:<number>];
}
于 2013-06-16T20:00:24.967 回答
3
array[1].num = 3;

这会起作用,但是,问题是,如果将对象放入数组中,编译器会丢失有关对象的类型信息。运行时仍然可以识别它是什么类型的对象。你只需要礼貌地通知编译器。

((ClassA *)(array[1])).num = 3;
于 2013-06-16T20:00:18.140 回答