2011-12-04 23 views
0

在objective-c中創建一個常量的方式是什麼? (例如classA.KEY_FOR_ITEM1)在被稱爲類屬性的objective-c中創建常量? (例如classA.KEY_FOR_ITEM1)

這就是我看到的建議重新如何在這裏創建一個常量http://stackoverflow.com/questions/538996/constants-in-objective-c然而,這種方法的方法似乎創建一個常數,是全球性的,可以在任何地方引用。

我更感興趣的是你必須使用類名來指定上下文。所以說你有一個Event對象,那麼你可以有事件類型常數指定(如EVENTTYPE_DIRECT)

EventType.EVENTTYPE_DIRECT 

所以,問題是會的是* .h和* .M代碼段是什麼,這

回答

3

聲音對我來說,就像你來自Java風格的語言背景一樣,我也一樣(抱歉,如果我在這裏猜錯了)。我也想了一會兒,然後我注意到Apple如何定義枚舉並使用它們來定義像你所描述的常量。

讓我們用虛構類Event爲例:

在頭文件中,要定義一個新的枚舉:

typedef enum { 

    kEventType_EventName1, 
    kEventType_EventName2, 
    kEventType_EventName3 

}EventType; //this is the name of the new type 

其中EventName1等,被替換的實際名稱你想要的事件(即kEventType_Direct

需要看到這些事件類型只需要導入您Event.h文件中其他任何類:。

#import "Event.h" 

然後你可以像使用任何其他變量類型一樣使用EventType(記住它不是NSObject,並且不能保留,釋放等等 - 你會像處理其他C類型一樣對待它:int ,float等)

你甚至可以將EventType類型的變量作爲其他類的成員,只要這些類導入了你的Event.h頭文件。

但是,它允許你做這樣的事情:

-(void) handleEventOfType: (EventType) evtType { 

    switch(evtType) { 
     case kEventType_EventType1 : 
      //stuff here 
      break; 

     //etc... 

    } 
} 

這是我所見過的做,所以目前最好的方法,並且似乎是普遍實行出國(至少在方式大部分我見過的項目)。無論如何,希望有所幫助!

+0

非常感謝 - 所以我想不得不先指定類上下文,因爲在我的示例「EventType.EVENTTYPE_DIRECT」中你不能這樣做嗎?但相反,你工作的基礎上,它至少不是全球性的,因爲你必須先進行導入......哦,是的,你是非常正確的先前被污染的Java :) – Greg

+0

是的,你有它。我也想得到類似ClassName.EVENT_TYPE的東西,並嘗試了一些不同的東西,但我沒有得到任何不涉及某些醜陋實現的東西。對於C++和Objective C,枚舉是要走的路:) – Ian

1

不清楚你在這裏試圖做什麼 - 是用來替代類中某個屬性的「常量」,還是Class1.CONSTANT應該返回一個不同的值給Class2.CONSTANT?

無論哪種方式,似乎常量不是正確的方法在這裏。在前一種情況下,只需使用不動產訪問器 - 如果您決定改變這種情況,那麼重構工具就會變得微不足道。

在後一種情況下,每個類都可以有一個類方法,並帶有您所需的名稱,該方法返回適合該類的值。再一次,如果這改變了重構工具將會有所幫助。

向這個混合添加常量看起來沒有必要,並且引入了額外的依賴(維護常量),沒有任何實際的好處。

+0

@jturton - 它是後者的一種 - 爲每個創建方法都可以,但是我想我想知道是否有更簡單(更快)的方法來做到這一點那個objective-c支持,注意到答案可能不是。我只是喜歡這樣一個想法,即一個真正只適用於Event類的常量,應該有一種方法,在使用它時需要指定Event類上下文...(例如EventType.EVENTTYPE_DIRECT)...所以它實際上只是一個如果可能的話,我希望在我的代碼中具有可讀性。 – Greg

+0

方法名稱是我想要的方式 - 這也爲您提供了代碼完成的好處。在其他答案中建議的枚舉也很好。 – jrturton