2010-07-19 3 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.

Questions connexes