-6

在过去的几个小时里,我一直在尝试做一些对我来说非常有意义但对 Xcode 没有意义的事情,但我仍然没有找到一种方法来做到这一点。就这样吧。

NSArray *array = [MedInfo getCategoryFirstIndexArray];

这里,getCategoryFirstIndexArray只是一个类方法MedInfo

@interface MedInfo : NSObject
+(NSArray *)getCategoryFirstIndexArray;
@end

但是 Xcode 一直告诉我代码中有错误,说“预期的表达式”?有趣的是,如果我[MedInfo getCategoryFirstIndexArray];只说,编译器说没问题,但是一旦我试图将返回值分配给另一个变量,就会出现错误。

那么我在这里做错了什么?我要求太多了吗?

编辑:好的,这很愚蠢。我一直在尝试在 switch 语句中创建一个新变量,如下所示:

switch(self.viewType.integerValue)
{
    case 0:
        break;
    default:
        NSArray *array = [MedInfo getCategoryFirstIndexArray];
        break;
}

显然我不知道 Objective-C 不支持这一点(另一个讨厌这种可怕语言的原因)。对不起我的无知,谢谢你试图帮助的人!再见!

4

1 回答 1

3

这里有两个不同的问题。

  1. C 和 Objective-C 都不允许在标签之后直接 声明变量(请参阅在 switch 语句中声明变量或此答案:https ://stackoverflow.com/a/1115323/1187415 )。所以

    switch (k) {
        case 10:
            break;
        default:
            int x = 20; // ERROR: Expected expression
            break;
    }
    

    是任何一种语言的语法错误。如果您在标签后添加分号,它会起作用:

        default: ;
            int x = 20; 
            break;
    

    这适用于 C 和 Objective-C。因此,可以在 switch 语句中声明变量而不使用方括号{ ... }

  2. 使用自动引用计数,这不再适用于 Objective-C 对象(比较在将项目转换为使用 ARC 时,“switch case is in protected scope”是什么意思?):

    switch (k) {
        case 10: ;
            NSMutableArray *a = [NSMutableArray array];
            // ...
            break;
        default: // ERROR: Switch case is in protected mode
            break;
    }
    

    原因是 ARC 编译器需要一个定义良好的范围来控制对象的生命周期。现在唯一的解决方案是引入一个额外的{ ... }范围:

    switch (k) {
        case 10: {
                NSMutableArray *a = [NSMutableArray array];
                // ...
            }
            break;
        default: // Switch case is in protected mode
            break;
    }
    

所以这更像是一个 ARC 问题而不是 Objective-C 问题。

于 2013-08-11T16:01:35.107 回答