2011-08-31 109 views
8

我有一個設計相關的問題。爲什麼使用字符串常量與枚舉常量?

我見過UiApplication類,有這種標誌:

UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification 
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification 
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification; 

,並在另一側,類的UITableView聲明類似結構:

typedef enum { 
    UITableViewScrollPositionNone,   
    UITableViewScrollPositionTop,  
    UITableViewScrollPositionMiddle, 
    UITableViewScrollPositionBottom 
} UITableViewScrollPosition; 

一個是通知另一個定義對象的類型。我相信這兩個是設計選項來「標記」一些相關對象,並根據該標誌在運行時進行分解。

假設我想創建一個需要標記對象的工廠。 在下圖中,我想爲每個部分和小部件枚舉或ID。任何小部件如何通信或「調用」另一個? e.j. [[Containter sharedInstance] presentWidget:?? forSection:?? withInfo:(ID)信息];

enter image description here

是否有更深或更準確的理由選擇其中之一嗎? 感謝您的幫助。

+0

注意,要先將一個字符串的「集合」,其中第二將是一個整數的選擇(開始@ 0) – KevinDTimm

+0

隨着什麼凱文說,我不相信你會成功的字符串枚舉。枚舉非常適合分組標籤。在我的公司,我們通常會明確設置枚舉值,以防我們決定在路上刪除枚舉值。一些保持狀態的代碼可能會使用枚舉值來指示狀態,但是如果您加載應用程序的新版本並刪除了一個值,則會影響枚舉中的所有值,除非它們被明確指定。 – Sam

+0

我想到的一件事是,對於字符串,您不必知道將接收這些字符串的對象的接口。通過枚舉,涉及的每個對象都可以知道接收者接口...我是對的嗎? – chuckSaldana

回答

8

一個枚舉聲明是而不是一個結構,語法是相似的,但它只是定義了一系列命名的數字。

這些常量引用兩種不同類型的數據類型,字符串與數字。

在UIApplications命名常量是指向的NSString 對象,他們有一個指針值,並且也有一個字符串常量,它們指向(這是在.m文件)。有點像宣稱的一些字符串常量,像這樣的(除非他們是extern和定義在其他地方完成):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification"; 

在UITableViewScrollPosition命名常量是給予整數值的名稱。有點像:

const int UITableViewScrollPositionNone = 0; 

原因在一種情況下使用枚舉(已命名的數字)是他們定義VS恆它們定義了幾個值的字符串中的所有可能的值,但有可能用戶定義他人。對於字符串常量,不同的庫可以各自定義它們自己,而沒有任何重複字符串地址的機會,而定義枚舉的擴展可能會在不同的庫之間產生衝突,如果它們定義相同的整數值以具有不同的含義。

+0

你可以爲FourCharCodes(OSType等)切換到UTI做類似的參數:你可以把一些數據標記爲'「com.bigco.document」',而不用擔心別人已經使用這個標識符,但是找到四個沒有其他人聲稱的Mac OS羅馬字符('BgCo'?)要困難得多。您可以擴大數字範圍以允許更多字符,但仍然存在使用字符串標識符時不存在的人爲上限。 –

+0

對。如果你定義了兩個具有相同標識符名稱的字符串常量,你將會得到一個鏈接器錯誤,你不能有重複的外部標識符。同樣,你不能有重複的反向域名,假設他們是真實的註冊域名。 – progrmr

0

聽起來像你需要在對象上的枚舉屬性。所以object.UITableViewScrollPosition

如果你聲明你的類中的常量,你將不能夠改變這些特定對象。