我在我的代码中这样做,它给了我这个错误:表达式不是整数常量表达式
代码:
//Tag for Database
#define kInsertIntoDatabase @"Insert"
#define kDeleteFromDatabase @"Delete"
#define kUpdateIntoDatabase @"Update"
#define kQueryDatabase @"Query"
-(void)documentIsReady:(NSString *)sqlmethod{
if(document.documentState == UIDocumentStateNormal)
{
context = document.managedObjectContext;
}
switch (sqlmethod) {
case kInsertIntoDatabase:
[self insertCoreDataModel];
break;
case kDeleteFromDatabase:
[self deleteCoreDataModel];
break;
case kUpdateIntoDatabase:
[self updateCoreDataModel];
break;
case kDeleteFromDatabase:
[self deleteCoreDataModel];
break;
default:
break;
}
}
有什么问题?不确定有什么问题。需要一些指导...
答案 0 :(得分:16)
如果你想使用这个开关,你应该选择一个enum,它可以让你在切换整数时保持可读性。
试试这个:
typedef enum {
DatabaseMainFunctions_InsertIntoDatabase,
DatabaseMainFunctions_DeleteFromDatabase,
DatabaseMainFunctions_UpdateInto,
DatabaseMainFunctions_Query
}DatabaseMainFunctions;
然后像
switch (sqlmethod) {
case DatabaseMainFunctions_InsertIntoDatabase:
[self insertCoreDataModel];
break;
case DatabaseMainFunctions_DeleteFromDatabase:
[self deleteCoreDataModel];
break;
case DatabaseMainFunctions_UpdateInto:
[self updateCoreDataModel];
break;
case DatabaseMainFunctions_Query:
[self deleteCoreDataModel];
break;
default:
break;
}
注意,您的案例删除在您的示例中写了两次,可能是一些复制粘贴错误。
来自Nicolas Bouilleaud的github 目标c开关为字符串(实际上是对象):objcswitch
答案 1 :(得分:4)
在switch语句中,您只能使用整数常量表达式作为标签。没有浮点数,没有结构,没有指针,没有对象,没有。只是整数常量。如果您想根据NSString
相等性做出决策,则需要使用嵌套if-else
语句:
if ([sqlmethod isEqualToString:kInsertIntoDatabase]) {
// do stuff
} else if ([sqlmethod isEqualToString:kDeleteFromDatabase]) {
// etc.
}
答案 2 :(得分:3)
所有这些
#define kInsertIntoDatabase @"Insert"
#define kDeleteFromDatabase @"Delete"
#define kUpdateIntoDatabase @"Update"
#define kQueryDatabase @"Query"
是NSString
,case
需要integer
,
您的代码已转换为
case @"Insert":
这是switch-case
语句的语法/语法错误。