web-dev-qa-db-fra.com

Propriété Objective-C qui est en lecture seule publiquement, mais qui a un setter privé

J'aimerais utiliser le @property syntaxe pour déclarer une propriété synthétisée qui est publiquement en lecture seule mais qui a un setter qui peut être appelé en privé depuis la classe.

Puisque c'est Objective-C, cela signifie essentiellement que le setFoo: serait synthétisée, mais l'appeler en dehors de la classe elle-même entraînerait un avertissement (sélecteur non reconnu). Pour déclencher l'avertissement, je dois déclarer la propriété readonly; existe-t-il un moyen de forcer un setter synthétisé qui n'est disponible que dans la classe?

63
Adam Ernst

Je pense que ce que vous recherchez s'appelle des extensions de classe. Vous déclareriez la propriété en lecture seule dans l'en-tête:

@interface MyClass : NSObject {
}

@property (readonly, assign) NSInteger myInteger;

@end

Ensuite, redéclarez dans votre extension de classe dans le fichier d'implémentation:

@interface MyClass ()

@property (readwrite, assign) NSInteger myInteger;

@end


@implementation MyClass

@end

Pour en savoir plus, consultez Apple's documentation

102
Sean Rich

Je suis peut-être en retard, mais sans extension, j'ai utilisé la technique suivante

@interface MyClass : NSObject {
 NSString * name;
}

@property (readonly, strong) NSString * name;

@end

d'autre part dans le fichier d'implémentation

@implementation MyClass
 @synthesize name;

 - (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{ 
  name = @"abc";
}

return self;
}

@end

ce faisant, il définira votre valeur et sera accessible en lecture seule. Merci.

1
Majid Bashir