2017-01-03 25 views
6

içinde depolanan tanımlayıcı ile orada olup Bu NSString ile eşleşen makro değişkeninin içeriği. İşte<pre><code>CONSTANT_1 CONSTANT_2 CONSTANT_3 CONSTANT_4 etc.. </code></pre> <p></p> ben nasıl erişebilir, başka bir sınıftan gönderme bir <strong>NSString</strong> değişken sadece makro adının oluşur var ben adlandırılmış makroları NSString

NSString *[email protected]"CONSTANT_3" 
+0

gibi bu yöntemi kullanabilirsiniz sabitleri: Sen gerektirir tanımlamak için olanlar bir sebep mi var? Gerçek sabitler yerine, demek istedim? Ve dahası, tanımlar her ne olursa olsun "@" biçiminde olamaz, böylece değişkeniniz sadece NSString * str = CONSTANT_3' olabilir (yani, @ ve "" dışında bırakabilirsiniz)? DashAndRest'in cevabı sorunu mükemmel bir şekilde çözüyor, ama tüm bu şey bana ilk başta garip tasarım gibi kokuyor ... – Gero

cevap

4

1 Bunu yapacak kişinin çözümdür, ama tüm makroları bilmek sana ihtiyacı:

Benim NSString değişken olarak tanımlanır

#define CONSTANT_1 1 
#define CONSTANT_2 2 
#define CONSTANT_3 3 

#define STRINGIZE(x) #x 

+ (int)getValueForContant:(NSString *)constantStr { 
    const char *charStr = STRINGIZE(CONSTANT_1); 
    NSString *str = [NSString stringWithUTF8String:charStr]; 
    if ([constantStr isEqualToString:str]) { 
     return CONSTANT_1; 
    } 

    charStr = STRINGIZE(CONSTANT_2); 
    str = [NSString stringWithUTF8String:charStr]; 
    if ([constantStr isEqualToString:str]) { 
     return CONSTANT_2; 
    } 

    return -1; 
} 

Ve olarak kullanmak:

int constVal = [ClassName getValueForContant:@"CONSTANT_1"]; 

Geri döndürme int verir n.

sabitlerini tanımlamak için .plist kullanın ve bu yönteme sağlanan dize parametresi olarak uygun değer elde etmek için geçiş yapın; Ben daha iyi kullanmak için öneriyoruz

+ (int)getValueForContant:(NSString *)constantStr 
+0

Bunun gerçekten bir kanonik cevap olduğunu söyleyebilirim, ama yine de gözlerim kanıyor ve İsa'nın ağzı ağlıyor ...: D olsa da, DashAndRest! Bunun aynı anda mümkün olduğunu düşünmemiştim (doğru, yine de bir şekilde karamsar görünen kod) – Gero

1

NSString *const CONSTANT_1 = @"1"; 
NSString *const CONSTANT_2 = @"2"; 
NSString *const CONSTANT_3 = @"3"; 

Eğer CFBundleGetDataPointerForName

-(NSString *)valueOfConstantWithName:(NSString *)constantName { 
    void ** pointer = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)constantName); 
    return (__bridge NSString *)(pointer ? *pointer : nil); 
} 

kullanmak ve daha fazla açıklığa kavuşturmak için

NSString *costant1 = [self valueOfConstantWithName:@"CONSTANT_1"];