而不是字符串,声明一个enum
typedef enum {
    kEnemyInvalid = 0,
    kEnemyName1,
    kEnemyName2,
    [...]
} EnemyType;
 
Enemy为所有敌人类型创建一个具有全局属性的类。
 
- 为每种类型创建必要的敌人子类。一个班级可能会涵盖不止一种敌人类型。
 
创建一个函数(可能是一个类方法)
Class EnemyClassFromEnemyType(EnemyType type) {
    switch (type) {
        case kEnemyName1:
           return [EnemyName1 class];
        case kEnemyName2:
           return [EnemyName2 class];
        default:
           return Nil;
    }
}
这个函数在敌人类型和实现它的类之间建立了联系。有一些方法可以让它更漂亮,我首选的方法是使用 X-Macros。
 
现在让我们创建一个工厂方法来创建敌人
+ (Enemy*)createEnemyWithType:(EnemyType*)enemyType {
    Class enemyClass = EnemyClassFromEnemyType(enemyType);
    return [[enemyClass alloc] initWithType:enemyType];
}
 
使用 X-Macros 也一样
头文件
#define ENEMY_DEFINITIONS \
  ENEMY_DEFINITION(kEnemyInvalid, = 0, Nil) \
  ENEMY_DEFINITION(kEnemyName1,, [EnemyName1 class]) \
  ENEMY_DEFINITION(kEnemyName2,, [EnemyName2 class])
#define ENEMY_DEFINITION(name, intValue, enemyClass) name intValue, 
/**
 * Your enum declaration.
 */
typedef enum {
    ENEMY_DEFINITIONS
} EnemyType;
#undef ENEMY_DEFINITION
Class EnemyClassFromEnemyType(EnemyType type);
NSString* NSStringFromEnemyType(EnemyType type);
实施文件
#define ENEMY_DEFINITION(name, intValue, enemyClass) [name] = @#name,
NSString* EnemyTypeStringTable[] = {
    ENEMY_DEFINITIONS
}
#undef ENEMY_DEFINITION
NSString* NSStringFromEnemyType(EnemyType type) {
    return EnemyTypeStringTable[type]
}
#define ENEMY_DEFINITION(name, intValue, enemyClass) classTable[name] = enemyClass;
Class EnemyClassFromEnemyType(EnemyType type) {
    static Class* classTable = nil;
    if (classTable == nil) {
        classTable = malloc(sizeof(Class) * sizeof(EnemyTypeStringTable) / sizeof(NSString*));
        ENEMY_DEFINITIONS
    }
    return classTable[type];
}
#undef ENEMY_DEFINITION
使用 X-Macros 技术的美妙之处在于您将所有东西都放在一个地方,您可以轻松添加更多类型而无需更改任何其他内容。你会得到类似 Java 枚举的东西,因为枚举可以有属性。