如何在ObjectiveC(2.0)中声明枚举值已被弃用

21

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

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;

显然,这要么完全行不通,要么我使用方法不正确。


1
可能是c++标记枚举值为弃用?的重复问题。 - László Papp
2个回答

24

我认为你将__attribute__位子放错了,应该放在赋值操作符的正确一侧。以下代码看起来可以正常工作:

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

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

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

在使用时要小心:在上面的示例中,它可以正常工作,因为等于号情况是相邻的( rawValue = 2),所以GeometricSquare也被分配为2,圆形是2+1=3。然而,假设我们有GeometricSquare = GeometricPoint。那么两者都将具有rawValue = 0,Objective-C会将0 + 1 = 1分配给圆形。但是,GeometricLine也是1,导致意外结果,即GeometricCircle = GeometricLine - Gobe
是的,它们需要彼此相邻。 - jscs

18

后来添加了一个方便的宏:

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

你如何弃用整个GenericFigures枚举,而不仅仅是其中的一个case? - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接