2017-01-23 111 views
0

我見過很多答案,只是在.m文件使用.h文件中extern int const Somethingint const Something = 1來定義常量。類常量沒有命名衝突

但問題是 - 這些不是類常量,我不能使用它們。符號或使用其他機制來區分擁有的類。

例如,

ClassA.h

extern int const SomeErrorCode; 

ClassB.h

extern int const SomeErrorCode; 

,然後我有ClassC.m,我想同時使用ClassA和ClassB的,並檢查他們的方法的錯誤代碼:

#import <ClassA.h> 
#import <ClassB.h> 

@implementation ClassC 

-(void)doIt 
{ 
    ClassA * objA = [[ClassA alloc] init]; 
    ClassB * objB = [[ClassB alloc] init]; 

    int resultA = [objA doSomething]; 
    // how do I check for resultA == ClassA.SomeErrorCode ? 

    int resultB = [objB doSomething]; 
    // how do I check for resultB == ClassB.SomeErrorCode ? 
} 

@end 

如何確保我可以使用這兩個類,並且在ClassA.SomeErrorCode和ClassB.SomeErrorCode沒有衝突的情況下它們具有不同的值?

+4

當我使用'extern',我使用前綴(比如當我創建類做),並給予他們的名字鏈接到它們被定義的類,並使用「K」,如果是常量,而不是如他們是靜態的。像'extern int const kAFMyClassAErrorCode' – Larme

+2

你有沒有想過爲什麼它們是常量名爲'UITextFieldTextDidChangeNotification'而不是'TextDidChange'? – Sulthan

+0

是的,這讓我覺得「yack,Objective-C很混亂」。如果沒有其他清潔選項,我想我必須習慣它。 – JustAMartin

回答

1

如果您不需要在定義它們的文件之外引用常量,則不要在.h文件中聲明它們。沒有這些聲明他們將不會被鏈接器看到,並且不會有名稱衝突。

如果你確實需要的常量,可以在其他模塊可見,你需要彌補他們是全球唯一的名稱。