Objective c 目标c要求参数为常数

Objective c 目标c要求参数为常数,objective-c,Objective C,所以我对objective 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"; typedef e

所以我对objective 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";
typedef enum {
    MAP_TILES_TYPE_IDX,
    MAP_TILES_TYPE_MLS,
    MAP_TILES_TYPE_PROPERTY,
    MAP_TILES_TYPE_SERVICES
} MapTilesType;
...
-(void) addTileLayer:(MapTilesType)type {
    ...
}
NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"];
我有一个方法应该只接受以下字符串之一:

-(void) addTileLayer:(NSString *)type {
...
}
有谁能给我一个建议来更好地执行这样一个事实:我希望参数类型是我定义的常量之一


我愿意接受任何建议。

如果您需要一个只接受某些字符串的方法,为什么不让它使用枚举而不是NSString作为参数,并在内部将枚举转换为您需要的字符串


这样,该方法的用户将仅限于枚举值。此外,您还可以隐藏实际字符串,这些字符串并不总是需要的,但看起来更干净。

如果您需要一个方法来只接受某些字符串,为什么不让它以枚举而不是NSString作为参数,并在内部将枚举转换为所需的字符串

这样,该方法的用户将仅限于枚举值。此外,您还可以隐藏实际字符串,这些字符串并不总是需要的,但看起来更干净。

您应该用枚举替换NSString,如下所示:

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";
typedef enum {
    MAP_TILES_TYPE_IDX,
    MAP_TILES_TYPE_MLS,
    MAP_TILES_TYPE_PROPERTY,
    MAP_TILES_TYPE_SERVICES
} MapTilesType;
...
-(void) addTileLayer:(MapTilesType)type {
    ...
}
NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"];
如果这些常量需要NSString,请定义将枚举值映射到字符串的NSArray,如下所示:

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";
typedef enum {
    MAP_TILES_TYPE_IDX,
    MAP_TILES_TYPE_MLS,
    MAP_TILES_TYPE_PROPERTY,
    MAP_TILES_TYPE_SERVICES
} MapTilesType;
...
-(void) addTileLayer:(MapTilesType)type {
    ...
}
NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"];
应使用枚举替换NSString,如下所示:

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";
typedef enum {
    MAP_TILES_TYPE_IDX,
    MAP_TILES_TYPE_MLS,
    MAP_TILES_TYPE_PROPERTY,
    MAP_TILES_TYPE_SERVICES
} MapTilesType;
...
-(void) addTileLayer:(MapTilesType)type {
    ...
}
NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"];
如果这些常量需要NSString,请定义将枚举值映射到字符串的NSArray,如下所示:

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";
typedef enum {
    MAP_TILES_TYPE_IDX,
    MAP_TILES_TYPE_MLS,
    MAP_TILES_TYPE_PROPERTY,
    MAP_TILES_TYPE_SERVICES
} MapTilesType;
...
-(void) addTileLayer:(MapTilesType)type {
    ...
}
NSArray *tileTypeToTypeName = @[@"idx", @"mls", @"mu", @"sr"];

你考虑过使用枚举吗?你考虑过使用枚举吗?那不应该是typedef enum{…}mapTileType以确保addTileLayer不被int调用吗?@特洛伊木马绝对是!谢谢你的留言!将它们映射到字符串是绝对必要的-我考虑过这样做,但是虽然我可以在编译时定义枚举,但我不能在编译时将值映射到字符串,然后我需要实例化对象以定义数组值,从而映射枚举值-不是吗?我希望能够将常量映射到它的值,而不必实例化对象,尽管我知道这可能是不可能的。@亚当:要将它们转换为字符串,我实际上会使用if…else if…语句,因为使用枚举类型作为索引是可行的,但近乎神奇。如果您有许多不同的值,则可以将NSDictionary与一起使用。@在此方案下,实例化NSArray对象是必要的,但您不必多次实例化它。您可以在使用tileTypeToTypeName数组的转换单元中将其设置为静态变量,或者将其设置为类中的ivar,并在viewDidLoad调用中实例化。这不应该是typedef enum{…}MapTileType,以确保addTileLayer不使用int调用吗?@trojanfoe!谢谢你的留言!将它们映射到字符串是绝对必要的-我考虑过这样做,但是虽然我可以在编译时定义枚举,但我不能在编译时将值映射到字符串,然后我需要实例化对象以定义数组值,从而映射枚举值-不是吗?我希望能够将常量映射到它的值,而不必实例化对象,尽管我知道这可能是不可能的。@亚当:要将它们转换为字符串,我实际上会使用if…else if…语句,因为使用枚举类型作为索引是可行的,但近乎神奇。如果您有许多不同的值,则可以将NSDictionary与一起使用。@在此方案下,实例化NSArray对象是必要的,但您不必多次实例化它。可以在使用tileTypeToTypeName数组的转换单元中将其设置为静态变量,也可以在类中将其设置为ivar,并在viewDidLoad调用中实例化。