2012-04-15 31 views
13

Giả sử một thời gian dài trước đây, tôi đã tạo ra kiểu liệt kê sau đây:Làm thế nào để khai báo một giá trị enum như đang bị phản đối trong ObjectiveC (2.0)

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

tôi giới thiệu những một thời gian trước trong động cơ tuyệt vời của tôi và bây giờ tôi đã quyết định cuối cùng rằng mọi người không nên sử dụng GeometricSquare nữa vì điều đó được bao phủ bởi GeometricRectangle rồi.

Đối với một sự khởi đầu, tôi sẽ có thể thay đổi kiểu liệt kê của tôi đối với một cái gì đó như thế này:

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

Đó chắc chắn sẽ giữ động cơ tuyệt vời của tôi tương thích ngược nhưng mặt khác làm tăng rác di sản. Do đó, tôi muốn xóa GeometricSquare hoàn toàn trong tương lai gần. Để làm rõ điều đó với người dùng động cơ của tôi, tôi muốn đánh dấu GeometricSquare là không được chấp nhận. Mục tiêu của tôi là tài liệu (doxygen) cũng như hoàn thành mã (Xcode) và cuối cùng nhưng không kém phần trình biên dịch (GCC) sẽ làm cho người dùng thấy rõ ràng rằng GeometricSquare không nên được sử dụng nữa và đã được thay thế bởi GeometricRectangle.

Đối với tài liệu, tôi chỉ cần sử dụng từ khóa @deprecated;

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

Nhưng làm thế nào về Xcode và GCC?

Thật không may, thuộc tính GCC (phương pháp) thông thường dường như không thực hiện công việc. Việc thêm __attribute__((deprecated)) như được soạn thảo bên dưới sẽ gây ra lỗi cú pháp.

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

Parse Issue Dự kiến}

GeometricCircle 
}GeometricFigures; 

Vì vậy, rõ ràng rằng hoặc không hoạt động hoàn toàn hoặc chỉ đơn giản là tôi đang sử dụng nó sai.

+1

thể trùng lặp của [C++ đánh dấu enum giá trị như không được chấp nhận?] (http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

Trả lời

17

Tôi nghĩ rằng bạn đang gắn các bit __attribute__ vào bên trái của toán tử gán. Điều này dường như làm việc tốt:

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

và bây giờ gán GeometricSquare đưa ra một cảnh báo trình biên dịch:

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

Vì vậy, đơn giản, cảm ơn bạn rất nhiều - hoạt động hoàn toàn tốt đẹp. – Till

+0

Hãy cẩn thận khi sử dụng điều đó: trong ví dụ trên nó hoạt động hoàn hảo bởi vì trường hợp bằng nhau là trường hợp trước đó (rawValue = 2) sao cho 'GeometricSquare' được gán cho 2 là tốt và vòng tròn là 2 + 1 = 3. Tuy nhiên, giả sử chúng ta có 'GeometricSquare = GeometricPoint'. Sau đó cả hai sẽ có một rawValue = 0, và Objective-C sẽ gán 0 + 1 = 1 cho vòng tròn.Tuy nhiên, 'GeometricLine' cũng là 1, dẫn đến kết quả bất ngờ là' GeometricCircle = GeometricLine'. – Gobe

+0

Có, họ cần phải ở bên cạnh nhau. –

12

Tại một điểm sau đó một macro tiện đã được bổ sung:

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

Rất tốt, rất hữu ích khi biết! – Till

Các vấn đề liên quan