2010-07-19 15 views
5

J'ai cherché les ans dans stackoverflow et google aussi, mais n'ai pas eu ce dont j'ai besoin.Dans l'objectif c, est-il possible de définir une valeur par défaut pour une variable de classe?

Ce que je cherche:

est-il possible de définir des valeurs par défaut pour les propriétés de classe d'une classe? Comme ce que nous pouvons faire en Java, dans le constructeur de la classe eg.-

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'; 
} 

Pourquoi je cherche:

J'ai une classe avec environ 15 propriétés. Lorsque j'instancie la classe, je dois définir toutes ces variables/propriétés avec des valeurs par défaut. Cela rend mon code lourd et complexe. Si je pouvais définir des valeurs par défaut pour ces variables d'instance à partir de cette classe, cela devrait réduire cette complexité/redondance de code.

J'ai besoin de votre aide.

Merci d'avance pour votre aide.

-Sadat

+0

Par 'variable de classe' voulez-vous dire 'instance variable' (ivar)? – kennytm

+0

désolé de ne pas le mentionner clairement. oui sa variable d'instance – Sadat

Répondre

3

Écrivez le init, qui fait tout le travail de l'initialisation complète.

Ensuite il suffit d'écrire autant d'initiateurs avec des jeux de paramètres diférentes que vous avez besoin (mais pensez à ce sujet: avez-vous vraiment besoin ce ou que un?). Non, ne les laissez pas faire le travail. Faites-les laisser remplir toutes les valeurs par défaut (celles que vous ne fournissez pas au message, ce message de gestion des messages) et donnez tout à la première.

Ce premier initiateur est appelé initator désigné. Et assurez-vous de ne pas manquer Multiple Initializers and the Designated Initializer. Jamais ignorer le désigné!

Salutations

+2

Lien est mort alors s'il vous plaît résumer le point – okysabeni

1

Dans l'interface de la classe:

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

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

@end 

Puis, dans la mise en œuvre:

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

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

    return self; 
} 

(NSInteger est un typedef pour int ou long, selon l'architecture.

+0

merci @wevan. encore je dois envoyer quelques params à la méthode d'initialisation. est-il possible d'utiliser init {} ou quelque chose comme ça sans param? – Sadat

4

Si vous ne voulez pas spécifier les paramètres,

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

Puis, quand vous faites MyClass *instance = [[MyClass alloc] init], il va définir les valeurs par défaut pour les Ivars.

Mais je ne vois pas pourquoi vous avez posté le constructeur avec des paramètres mais vous ne voulez pas les utiliser.