6

有没有办法为类的类属性设置默认值? 就像我们在 Java 中可以做的一样,在类的构造函数中,例如 -

MyClass(int a, String str){//constructor
  this.a = a;
  this.str = str;
  
  // I am loking for similar way in Obj-C as follows 
  this.x = a*5;
  this.y = 'nothing';
}

我为什么要找:

我有一个大约有 15 个属性的类。当我实例化类时,我必须为所有这些变量/属性设置一些默认值。因此,这使我的代码既繁重又复杂。如果我可以从该类中为这些实例变量设置一些默认值,那必须降低此代码复杂性/冗余。

4

3 回答 3

4

如果你不想指定参数,

- (MyClass *)init {
    if (self = [super init]) {
        a = 4;
        str = @"test";
    }
    return self;
}

然后当你这样做时MyClass *instance = [[MyClass alloc] init],它会为 ivars 设置默认值。

但我不明白为什么你发布了带有参数的构造函数,但你不想使用它们。

于 2010-07-19T14:34:29.427 回答
3

编写init,它完成了完全初始化所有工作。

然后根据需要编写尽可能多的具有不同参数集的启动器(但请考虑一下:您真的需要这个还是那个?)。不,不要让他们做这项工作。让他们填写所有默认值(您不提供给message的那些,给这个消息处理实现)并将其全部提供给第一个。

第一个启动器称为指定启动器。并且一定不要错过Multiple Initializers 和 Designated Initializer。 永远不要忽视指定的!

问候

于 2010-07-19T21:05:23.087 回答
1

在类的界面中:

@interface YourClass : NSObject {
    NSInteger a;
    NSInteger x;
    NSString  *str;
    NSString  *y;
}

- (id)initWithInteger:(NSInteger)someInteger string:(NSString *)someString;

@end

然后,在实现中:

- (id)initWithInteger:(NSInteger)someInteger string:(NSString *)someString {
    if (self = [super init]) {
        a = someInteger;
        str = [someString copy];

        x = a * 5;
        y = [@"nothing" retain];
    }

    return self;
}

(NSIntegerintor的 typedef long,具体取决于架构。)

于 2010-07-19T11:52:58.207 回答