3

我在我的代码中这样做,它给了我这个错误:Expression is not an integer constant expression

代码:

//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;
    }

}

怎么了?不知道出了什么问题。需要一些指导...

4

3 回答 3

16

如果你想使用开关,你应该选择一个枚举,这将使你在开关整数时保持可读性。

试试这个:

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

于 2013-03-02T14:41:34.807 回答
4

在 switch 语句中,您只能将整数常量表达式用作标签。没有浮点数,没有结构,没有指针,没有对象,什么都没有。只是整数常量。如果要基于NSString相等性做出决策,则需要使用嵌套if-else语句:

if ([sqlmethod isEqualToString:kInsertIntoDatabase]) {
    // do stuff
} else if ([sqlmethod isEqualToString:kDeleteFromDatabase]) {
    // etc.
}
于 2013-03-02T14:36:12.757 回答
3

所有这些

#define kInsertIntoDatabase            @"Insert"
#define kDeleteFromDatabase            @"Delete"
#define kUpdateIntoDatabase            @"Update"
#define kQueryDatabase                 @"Query"

NSString,并且case需要integer

您的代码转换为

case @"Insert":

这是switch-case语句的句法/句法错误。

于 2013-03-02T14:35:20.977 回答