2009-05-29 7 views

Répondre

3

Essayez ceci:

Class theClass = NSClassFromString(someString); 
id object = [[theClass alloc] init]; 
1

Si vous voulez dire que la chaîne indique le nom de la classe, alors oui il est facile de le faire en utilisant la fonction NSClassFromString pour rechercher l'objet classe appropriée « usine »:

NSString* myClassName = @"NSNumber"; 
id myNewObject = [[NSClassFromString(myClassName) alloc] init]; 

// myNewObject is an NSNumber... 

L'exemple est artificiel, mais vous avez l'idée.

1

Oui:

//In your header 
extern NSString *FrobnitzerCalibrationHigh; 
extern NSString *FrobnitzerCalibrationMedium; 
extern NSString *FrobnitzerCalibrationLow; 

//In your implementation 
NSString *FrobnitzerCalibrationHigh = @"FrobnitzerCalibrationHigh"; 
NSString *FrobnitzerCalibrationMedium = @"FrobnitzerCalibrationMedium"; 
NSString *FrobnitzerCalibrationLow = @"FrobnitzerCalibrationLow"; 

Vous pouvez faire quelques macros et de les mettre dans votre tête préfixe:

//Semicolons intentionally omitted (see below) 
#define DECLARE_STRING_CONSTANT(name) extern NSString *name 
#define DEFINE_STRING_CONSTANT(name) NSString *name = @#name 

les utiliser dans vos en-têtes de classe et les implémentations:

//In your header 
DECLARE_STRING_CONSTANT(FrobnitzerCalibrationHigh); 
DECLARE_STRING_CONSTANT(FrobnitzerCalibrationMedium); 
DECLARE_STRING_CONSTANT(FrobnitzerCalibrationLow); 

//In your implementation 
DEFINE_STRING_CONSTANT(FrobnitzerCalibrationHigh); 
DEFINE_STRING_CONSTANT(FrobnitzerCalibrationMedium); 
DEFINE_STRING_CONSTANT(FrobnitzerCalibrationLow); 

(Les macros omettent les points-virgules car leurs utilisations les fournissent. Eh bien, l'expansion serait extern NSString *FrobnitzerCalibrationHigh;; -aussi bien dans ce cas, mais ça m'embêterait si je le faisais, surtout parce que ce n'est pas anodin dans d'autres cas.)