Objective c 如何在Objective(2.0)中将枚举值声明为已弃用

Objective c 如何在Objective(2.0)中将枚举值声明为已弃用,objective-c,enums,deprecated,Objective C,Enums,Deprecated,假设很久以前,我创建了以下枚举: typedef enum { GeometricPoint, GeometricLine, GeometricSquare, GeometricRectangle, GeometricCircle }GeometricFigures; 不久前,我在我的令人敬畏的引擎中引入了这些,现在我终于决定人们不应该再使用GeometricSquare,因为geometricctangle已经涵盖了这一点 首先,我可能会将枚举更改为以下内容:

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

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricSquare,
   GeometricRectangle,
   GeometricCircle
}GeometricFigures;
不久前,我在我的令人敬畏的引擎中引入了这些,现在我终于决定人们不应该再使用
GeometricSquare
,因为
geometricctangle
已经涵盖了这一点

首先,我可能会将枚举更改为以下内容:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
这当然会让我的引擎向后兼容,但另一方面会增加遗留垃圾。因此,在可预见的将来,我想完全删除
GeometricSquare
。为了让我的引擎的用户明白这一点,我想将
GeometricSquare
标记为不推荐使用

我的目标是,文档(doxygen)和代码完成(Xcode)以及最后但并非最不重要的编译器(GCC)将让用户清楚地看到,
geometrycsquare
不应该再使用了,它已经被
geometryctangle
所取代

对于文档,我只需使用
@deprecated
关键字

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   ///@deprecated Has been replaced by GeometricRectangle
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
但是Xcode和GCC呢

不幸的是,通常的GCC(method)属性似乎不起作用。按如下所示添加
\uuuuu属性((不推荐))
会导致语法错误

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle __attribute__((deprecated)),
解析问题 预期值}


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

我认为您将
\uuuu属性\uuuu
位附加到赋值运算符的错误一侧。这似乎很管用:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __attribute__((deprecated)) = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
现在分配
GeometricSquare
将给出编译器警告:

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

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

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

使用时请小心:在上面的示例中,它非常有效,因为相等的情况是前一个(rawValue=2),所以
GeometricSquare
也被指定为2,而圆是2+1=3。但是,假设我们有
GeometricSquare=GeometricPoint
。然后两者的原始值都为0,Objective-C将0+1=1分配给圆。但是,
geometricCline
也为1,导致意外的结果是
GeometricCircle=geometricCline
。是的,它们需要相邻。您如何反对整个GenericFigures枚举,而不仅仅是其中的一个案例?
typedef NS_ENUM(NSInteger, GeometricFigures)
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle,
   GeometricCircle,
};