2013-06-05 2 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

Вы должны заменить NSString с enum, как это:

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

Если вам нужна NSString для этих констант, определяют NSArray, который отображает enum значения строк, например:

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

Не должно быть 'typedef enum {...} MapTilesType' для обеспечения' addTileLayer' не вызывается с 'int'? – trojanfoe

+1

@trojanfoe Абсолютно! Спасибо за примечание! – dasblinkenlight

+0

Абсолютно необходимо, чтобы они были сопоставлены с строками - я думал о том, чтобы делать это таким образом, но пока я могу определить перечисление во время компиляции, я не могу сопоставить значения со строками во время компиляции, а затем мне нужно будет создать экземпляр объекта, чтобы определить значения массива и, таким образом, отобразить значения enum - не так ли? Я хотел иметь возможность сопоставить константу с ее значением, не создавая экземпляр объекта, хотя я понимаю, что это может быть невозможно. – Adam

2

Если вам нужен метод для принятия только определенных строк, почему бы не заставить его перечислить вместо NSString в качестве аргумента и внутренне перевести перечисление на нужную строку?

Таким образом, пользователи метода будут ограничены только значениями перечисления. Кроме того, вы можете скрыть фактические строки из них (не всегда необходимо, но выглядит чище).

Смежные вопросы