2010-03-04 56 views
12

我有幾個obj-c類,每個類都需要一些在switch語句中使用的常量。類常量

我曾嘗試使用#define預處理器指令在.m文件中定義這些數值常量。所有這些常量都以'kCell'開頭。這似乎工作得很好,但是Xcode的代碼意義是向我展示每個'kCell'前綴常量,無論我在項目中的哪個位置。常量是否具有全局範圍#define?如果是這樣,什麼是最好的方式來定義純粹的局部類常量,將不會在其他類中使用類似命名的常量進行類型化?

回答

34

有自己的固定文件中像MyConstants。

在MyConstants.h聲明所有的常量:

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

和MyConstants.m定義它們

NSString* const kCellTitleKey = @"CellTitle"; 

通過保持常數在不同的文件中,這將是您輕鬆地跟蹤它們並改變它們的價值。

這是定義純粹常量的最好方法。這也將避免重複鍵。

你唯一需要做的就是導入您的其他類這個類:

#import "MyConstants.h" 

,並使用這些按鍵立刻:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey]; 
+4

拼寫錯誤,我喜歡(MyConstatnts)。 – pauloya 2012-01-20 14:20:22

+4

您也可以將#import「MyConstants.h」放入您的Prefix.pch文件中,以便可以從項目中的所有.m文件進行訪問。 – 2012-04-19 21:57:14

+0

但這些不是類常量。如果我有兩個文件ClassA.h和ClassB.h,並且在ClassB.h中ClassA.h和SomeErrorCode = 2中有一個常量'SomeErrorCode = 1'?我如何確保在調用代碼中,我可以檢查ClassA.SomeErrorCode和ClassB.SomeErrorCode,並且仍然得到兩個不同的值,因爲它們都在.h文件中定義? – JustAMartin 2017-01-23 16:07:27

5

#define常量僅存在於.m文件中。

如果常量是整數,你也可以在enum定義它們:

enum { 
    kCellSomething = 123, 
    kCellAnotherThing = 456, 
    ... 
}; 
1

這似乎是工作很好,但Xcode的代碼感無論我在項目中的哪個位置,都會向我呈現每個'kCell'前綴常量。 #define常量是否具有全局範圍?如果是這樣,什麼是最好的方式來定義純粹的局部類常量,將不會在其他類中使用類似命名的常量進行類型化?

Xcode代碼感知和運行時可用性不完全相同。 Xcode還提供了selectorNames和其他在運行時不可見的項目。

.m文件中定義的所有內容在運行時都是本地的。

也有看看這個問題: Constants in Objective-C

8

我通常發現,枚舉最好用於開關:

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; 
    } 
} 

不幸的XCode不會限制它的代碼感(代碼完成,自動 - 完整)到任何特定的文件。它試圖找出哪些常量可以從代碼的哪些區域訪問,但我注意到它不是100%準確的。

我會建議不要用相同的前綴開頭。例如,如果您有兩種不同類型的表格單元格,kCustomCell和kOtherCell可能是更好地命名常量的方法。