【问题标题】:How to declare an enum value as being deprecated in ObjectiveC (2.0)如何在ObjectiveC(2.0)中将枚举值声明为已弃用
【发布时间】:2012-04-27 07:10:00
【问题描述】:

假设很久以前,我创建了以下枚举:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricSquare,
   GeometricRectangle,
   GeometricCircle
}GeometricFigures;

我不久前在我的真棒引擎中介绍了这些,现在我终于决定人们不应该再使用GeometricSquare,因为GeometricRectangle已经涵盖了这一点。

首先,我可能会将我的枚举改成这样:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;

这肯定会让我的很棒的引擎向后兼容,但另一方面会增加遗留垃圾。因此,我想在可预见的将来完全删除GeometricSquare。为了让我的引擎用户明白这一点,我想将 GeometricSquare 标记为已弃用。

我的目标是文档 (doxygen) 以及代码完成 (Xcode) 以及最后但并非最不重要的编译器 (GCC) 将使用户清楚地知道 GeometricSquare 不应再使用并且已经替换为GeometricRectangle

对于文档,我会简单地使用 @deprecated 关键字;

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   ///@deprecated Has been replaced by GeometricRectangle
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;

但是 Xcode 和 GCC 怎么样?

不幸的是,通常的 GCC(方法)属性似乎不能胜任这项工作。如下所示添加__attribute__((deprecated)) 会导致语法错误。

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle __attribute__((deprecated)),

解析问题 预期 }

   GeometricCircle
}GeometricFigures;

很明显,要么完全不起作用,要么我只是用错了。

【问题讨论】:

标签: objective-c enums deprecated


【解决方案1】:

我认为您将__attribute__ 位附加到赋值运算符的错误一侧。这似乎工作正常:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __attribute__((deprecated)) = GeometricRectangle,
   GeometricCircle
}GeometricFigures;

现在分配GeometricSquare 会给出编译器警告:

int fig = GeometricSquare;    //'GeometricSquare' is deprecated

【讨论】:

  • 使用它时要小心:在上面的示例中,它工作得很好,因为相等的情况是前一个(rawValue = 2)所以GeometricSquare也被分配给2,而circle是2 +1=3。但是,假设我们有GeometricSquare = GeometricPoint。那么两者都会有一个 rawValue = 0,而 Objective-C 会将 0+1=1 分配给圆。但是GeometricLine也是1,导致GeometricCircle = GeometricLine的意外结果。
  • 是的,它们需要彼此相邻。
【解决方案2】:

后来添加了一个便利宏:

typedef NS_ENUM(NSInteger, GeometricFigures)
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle,
   GeometricCircle,
};

【讨论】:

  • 您将如何弃用整个 GenericFigures 枚举,而不仅仅是其中的一个案例?
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多