Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to declare constants

I'm steadily getting the hang of Objective-C, but am still very much a beginner and have a beginner-level question hopefully someone could shed some light on:

If I have a very simple project and want to set a constant that I'll use throughout—say, a NSDictionary with keys being month names and values being days in that month—how is this done? (I.e., what command form and where to put it?)

NOTE: If this example is already possible using built-in functions, perhaps we could just pretend it isn't for the purposes of this question ;)

like image 743
Rogare Avatar asked Nov 05 '12 15:11

Rogare


3 Answers

The answer depends on the type of your constant. If all you need is an int or a double, you can use preprocessor and the #define CONST 123 syntax. For Objective C classes, however, you need to do a lot more work.

Specifically, you would need to hide the constant behind a class method or a free-standing function. You will also need to add a prototype of that method or function in the header file, provide a function-scoped static variable to store the constant, and add code to initialize it.

Here is an example using a simple NSDictionary:

Header: MyConstants.h

@interface MyConstants
+(NSDictionary*)getConstDictionary;
@end

Implementation: MyConstants.m

+(NSDictionary*)getConstDictionary {
    static NSDictionary *inst = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        inst = @{
            @"key1": @"value1",
            @"key2": @"value2",
            @"key3": @"value3"
        };
    });
    return inst;
}

Usage:

NSString *val = [[MyConstants getConstDictionary] objectForKey:@"key2"];
like image 183
Sergey Kalinichenko Avatar answered Nov 05 '22 14:11

Sergey Kalinichenko


The accepted answer is correct, but if you prefer operate with variable (not trough method). I can suggest this pattern:

@implementation MyClass
 
static NSSet *mySetOfObjects;
 
+ (void)initialize {
    mySetOfObjects = [[NSSet alloc] initWithObjects:@"one", @"two", @"three", nil];
}

// Example usage:  
+ (BOOL)isRecognizedString:(NSString *)searchItem {
    return [mySetOfObjects containsObject:searchItem];
}
 
@end

As for me - it looks better.


For more details the source is here.

like image 38
skywinder Avatar answered Nov 05 '22 14:11

skywinder


Let's assume you want to declare an NSString constant in your class that holds a url. In your header .h file you will need the following:

#import 

extern NSString * const BaseURL;

@interface ClassName : NSObject {

You will then need to set it's value in your main .m file as follows:

#import "ClassName.h"

NSString * const BaseURL = @"http://some.url.com/path/";

@implementation ClassName

You can now access this constant throughout your class or subclasses. Here's an example of usage:

NSString *urlString = [NSString stringWithFormat:@"%@%@", BaseURL, @"filename.html"];
like image 2
Harish Avatar answered Nov 05 '22 12:11

Harish