2013-06-05 46 views
1

所以我是新的目標C,並在一般類型的語言,雖然我很享受他們的詳細程度。客觀的c要求參數是一個常數

我定義了一堆常數是這樣的:

NSString const *MAP_TILES_TYPE_IDX = @"idx"; 
NSString const *MAP_TILES_TYPE_MLS = @"mls"; 
NSString const *MAP_TILES_TYPE_PROPERTY = @"mu"; 
NSString const *MAP_TILES_TYPE_SERVICES = @"sr"; 

和我有應該只接受其中一個字符串的方法:

-(void) addTileLayer:(NSString *)type { 
... 
} 

任何人可以給我一個建議,以更好地強制實現我希望參數type成爲我定義的常量之一的事實?

我願意接受任何建議。

+5

你有沒有想過使用'enum'? –

回答

4

你應該有enum取代NSString,像這樣:

typedef enum { 
    MAP_TILES_TYPE_IDX, 
    MAP_TILES_TYPE_MLS, 
    MAP_TILES_TYPE_PROPERTY, 
    MAP_TILES_TYPE_SERVICES 
} MapTilesType; 
... 
-(void) addTileLayer:(MapTilesType)type { 
    ... 
} 

如果你需要爲這些常量的NSString,定義一個NSArrayenum值映射到字符串,像這樣:

NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"]; 
+0

不應該是'typedef enum {...} MapTilesType'來確保'addTileLayer'不是用'int'調用的嗎? – trojanfoe

+1

@trojanfoe絕對!謝謝你的提示! – dasblinkenlight

+0

它是絕對必要的映射到字符串 - 我想這樣做的確切方式,但雖然我可以在編譯時定義枚舉,我不能在編譯時將值映射到字符串,然後我需要實例化對象以便定義數組值,從而映射枚舉值 - 不是嗎?我希望能夠將一個常量映射到它的值,而不必實例化一個對象,但我明白這可能是不可能的。 – Adam

2

如果你需要一個方法來接受只有特定的字符串,爲什麼不使用一個枚舉而不是NSString作爲參數,並在內部將枚舉轉換爲你需要的字符串?

這種方法的用戶將僅限於枚舉值。另外,你可以隱藏實際的字符串(並不總是需要,但看起來更乾淨)。

相關問題