2013-02-22 77 views
3

正如標題所說 - 在Java中,我只是讓類定義常量,然後將它們導入將使用它們的類中。它在Objective-C中以相同的方式完成嗎?共享常量定義變量的標準是什麼

爲了明確這一點,我想

#define variable 1 
#define variable 2.0 

而且在不同的類中使用相同的常量。

+1

術語擡頭:當它們是#defined常量時,它們不是「變量」。 :)與Java不同,當你在C中定義一些東西時,你正在進行實際的文本替換;它不像一個變量不會發生變化(爲了某些目的,C中存在const全局變量)。 – 2013-02-22 23:44:35

+2

@BenZotto如果術語:它們被稱爲宏而不是常量。 – 2013-02-22 23:45:53

回答

3

將宏放入頭文件中,並在需要訪問頭文件時使用#include#import頭文件。

+0

ok SharedMacros.h :) – 2013-02-22 23:49:37

3

還有另一種使用宏的替代方法。你可以將它們定義爲全局變量。

在Constants.h:

extern int variableX; 
extern float variableY; 

在Constants.m(尤其在進口之前,任何其他代碼):

int variableX = 1; 
float variableY = 2.0f; 

有這種方法在宏的幾個優點:

  1. 客戶不需要看到值。
  2. 如果值發生變化,則不需要重新編譯導入Constants.h的每個文件。
  3. 這些值可以通過許多不同的方式初始化,而不僅僅是文字。
  4. 使用變量時類型安全性和編譯器檢查。
1

您的示例使用C預處理器宏。這與Objective-C的工作方式相同,都與支持C風格預處理器宏的其他任何環境一樣:將它們粘貼到共享標題中,並將其粘貼到#import#include之間。

雖然這很完美,但您特別提到了與類相關的常量和Objective-C。在Objective-C,你會經常看到不斷NSString的(例如,用於通知名或字典鍵)屬於這樣定義一個特定的類和類似的常量:

在頭(.h):

extern NSString * const LibraryEntryDidUpdateNotification; 
extern const NSUInteger LibraryEntryDefaultStarRating; 

@interface LibraryEntry : NSObject 

... 

在實施(.M):

NSString * const LibraryEntryDidUpdateNotification = @"LibraryEntryDidUpdateNotification"; 
const NSUInteger LibraryEntryDefaultStarRating = 3; 

@implementation LibraryEntry 

... 

這是蘋果公司是如何做的在他們的現代化框架,以及它是如何被許多第三方開發者來完成。在我看來,重構比預處理器宏更容易(例如,在Xcode中使用「重構」按鈕重命名類,同樣可以輕鬆處理這些常量),但常量的預處理器宏也具有它們的優點。

請參閱herehere,以便在您感興趣的情況下對該主題進行更深入的討論。

+0

第二篇參考文章幫助我確定#define是我的應用程序的方式。謝謝。 – 2013-10-10 14:26:33