Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class Constants

I have several obj-c classes, each of which require a number of constants 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?

like image 863
Garry Pettet Avatar asked Mar 04 '10 06:03

Garry Pettet


2 Answers

Have your own constant file like MyConstants.

In MyConstants.h declare all your constants:

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

and in MyConstants.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 constants. And this will avoid duplicate keys also.

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

#import "MyConstants.h"

and use these keys straight away:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey];
like image 166
Manjunath Avatar answered Sep 29 '22 19:09

Manjunath


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.

like image 45
ImHuntingWabbits Avatar answered Sep 29 '22 18:09

ImHuntingWabbits