views:

396

answers:

4
+2  Q: 

Class Constants

I have several obj-c classes, each of which require a number of contants that are used in switch statements.

I had tried defining these numerical constants in the .m file using the #define preprocessor instruction. All these constants begin with 'kCell'. This seems to work well but Xcode's code sense is presenting me with every 'kCell' prefixed constant no matter where I am in the project. Do #define constants have global scope? If so, what is the best way to define purely local class constants that won't class with similarly named constants in other classes?

+1  A: 

The #define constants only exist in the .m file.

If the constants are integers you could also define them in an enum:

enum {
  kCellSomething = 123,
  kCellAnotherThing = 456,
  ...
};
KennyTM
+4  A: 

Have your own constant file like MyConstatnts.

In MyConstatnts.h declare all your constatnts:

static const int kRedisplayTileCount = 5 ;
extern  NSString* const kCellTitleKey;

and in MyConstatnts.m define them

NSString* const kCellTitleKey = @"CellTitle";

By keeping constants in separate file, it will be easy for you to trace them and change their value.

This is the best way to define purely constatnts. And this will avoid duplicate Keys also.

Only you need to do is import this class in you other classes:

#import"MyConstatnts.h"

and use these keys straight away:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey];
Manjunath
+1  A: 

This seems to work well but Xcode's code sense is presenting me with every 'kCell' prefixed constant no matter where I am in the project. Do #define constants have global scope? If so, what is the best way to define purely local class constants that won't class with similarly named constants in other classes?

Xcode Code Sense and Runtime availability are not identical. Xcode also offers selectorNames and other stuff of items that are not visible at runtime.

Everything defined in a .m file is local at runtime.

Also have a look at this question: http://stackoverflow.com/questions/538996/constants-in-objective-c

maxbareis
+1  A: 

I generally find that enums are best used for switches:

typedef enum {
  kCellConstantOne = 1,
  kCellConstantTwo = 2, //...
} kCellConstants;

/* later */
- (void)foo:(kCellConstant)constant {
  switch (constant) {
    case kCellConstantOne:
      //do something
      break;
    case kCellConstantTwo:
      //do something else
      break;
  }
}

Unfortunately xCode doesn't restrict it's code sense (code completion, auto-complete) to any specific file. It tries to figure out which constants are accessible from which areas of your code but I've noticed it's not 100% accurate.

I would suggest not starting them all with the same prefix. For example, if you have two different types of table cells, kCustomCell and kOtherCell might be better ways to name you constants.

ImHuntingWabbits