【问题标题】:Objective-C return enum array from methodObjective-C 从方法返回枚举数组
【发布时间】:2010-10-01 16:56:01
【问题描述】:

我的 Objective-C 代码中有一个与此类似的枚举:

typedef enum {
    FRUIT_APPLE = 1,
    FRUIT_PEAR = 2,
    FRUIT_BANANA = 3,
    // etc. 
} Fruit

我需要能够在一个方法中返回一个数组,如下所示:

@implementation FruitTest

static Fruit fruits[] = {FRUIT_APPLE, FRUIT_BANANA};

+(Fruit[]) fruits
{
    return fruits;
} 

@end

但是,这会产生编译错误:

#1  'fruits' declared as method returning an array 
#2  Incompatible types in return

关于如何解决这个问题的任何想法? 谢谢!

【问题讨论】:

    标签: objective-c arrays enums


    【解决方案1】:
    • 使用 C 代码,您不能像当前代码一样直接返回数组,但您需要返回一个指针。在obj-c中,也可以使用NSArray,可以返回。

    • 但是,您不能创建枚举数组,也不能创建 int 数组或 NSInteger 数组,您需要像 fruits = [NSArray arrayWithObjects:[NSNumber numberWithInt:enumValue]]; 那样做

    您的代码应如下所示:

    static NSArray *fruits;
    
    + (NSArray *)myFruits {
      if (!fruits) {
        fruits = [NSArray arrayWithObjects:[NSNumber numberWithInt:enumValue], nil];
      }
    }
    

    【讨论】:

    • 说不能在 Objective-C 中使用 C 数组并不准确。它们在 Cocoa 本身的几个不同的 API 中使用。只是它们对对象没有用,并且在任何语言中都很尴尬。
    • 没有理由不能在 Objective-C 中使用 C 代码,包括 C 数组。 NSArrays 通常更好,但对于一个简单的、静态的 int 值数组(枚举只是 int 值),C 数组可能更好。
    • 呃,我没说不能在 Objective-C 中使用 C 数组。我只是说他的代码不是 Objective-C 代码,我们可以返回一个 NSArray 但我们不能返回一个 C 数组(但是是的,我们可以返回一个指针)。但我会澄清它
    【解决方案2】:

    您必须将该方法声明为返回指向Fruit 的指针,而不是数组。你可以这样做:

    @implementation FruitTest
    
    static Fruit fruits[] = {FRUIT_APPLE, FRUIT_BANANA};
    
    +(Fruit *) fruits
    {
        return fruits;
    } 
    
    @end
    

    【讨论】:

    • 这样做的问题是,如果没有一些进一步的信息(如数组末尾的标记值),调用者无法知道指针所指的数组的大小.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多