【问题标题】:Can't figure out NS_ENUM. Can I change the values inside it?无法弄清楚 NS_ENUM。我可以更改其中的值吗?
【发布时间】:2014-04-20 11:11:26
【问题描述】:

我对 Objective-C 非常陌生。我遇到了这个问题:

NS_ENUM(NSUInteger, SetOfValues)
{ 
    firstRow = 0,
    secondRow,
    thirdRow,
    rowCount
};

现在,我需要在实现中更改这些变量:

@implementation BillyBurroughs 
...

- (void) modifyrowInformation
{
    secondRow = 0;
    thirdRow = 1;
    rowCount = 2
}

@end

当然,我收到一条错误消息 - 无法赋值。现在,我可以简单地将变量读取为局部变量,例如

+ (void) initialize {
    localFirstRow = 0 
    ...
}

然后修改它们,但是有没有一种更简洁、更懒惰的方法来做到这一点而无需额外的变量?对不起,如果这是一个非常基本的问题。感谢您的意见。

【问题讨论】:

  • 你想用这些“变量”做什么?枚举是常量,您可以将变量设置为枚举的值。
  • 还有比分配它们更好的选择吗?像 :P 一个可变的 NS_ENUM 之类的东西?至于你的问题,这个类的一百万个地方都在使用常量。更改一个并分配给局部变量对我来说意味着一百万次更改。所以我希望我能把它们抽象成更简单的东西。
  • 现在,我也不希望它们是静态的。所以除了定义 4 个属性,我真的想不通。
  • 一个枚举是常量...期间,没有枚举实例。所以它是完全相同的内存位置的 1000 倍。
  • 我建议将枚举设为一个类并在每个文件中对其进行分配初始化,但我真的不明白你想要做什么。

标签: objective-c variables scope nsenumerator


【解决方案1】:

枚举是常量,你不能改变它们的值,你为什么要改变?这就是 ivars 的用途。

NS_ENUM 是苹果给我们的一个不错的宏,它可以扩展为如下内容:

typedef enum {
    firstRow = 0,
    secondRow,
    thirdRow,
    rowCount,
} SetOfValues;

注意: 除非指定,否则默认为第一个元素初始化 0。

为枚举命名以避免冲突也是一种很好的做法,也许可以看看苹果的实现并将其应用于您自己的用例:

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
};

也许您正在寻找的是一个属性或一个数组?

array = @[ @1, @2, @3, @4 ];

编辑 cmets 中的问题:

在您的实现文件 (.m) 中,您可以创建一个私有标头:

@interface OKAClass ()
  @property (nonatomic, assign) NSUInteger property;
@end

然后,您可以使用 self_property 从该类中访问该属性

例如

self.property = 1;

_property = 1;

不同之处在于 self.property 使用生成的访问器,并且可能是您想要使用的,这将证明您希望覆盖 getter/setter 以更新另一个值。

【讨论】:

  • 补充。关于如何制作 NSUInteger 属性的任何建议?
  • @gran_profaci 我已经更新了答案,看看吧。
  • 谢谢。我最终使用了你所说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多