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,
};