2009-11-02 56 views
29

Có thể lặp qua các giá trị enum trong Objective-C không?lặp qua các giá trị enum

+0

Retagged: đây là (AFAIK) C câu hỏi thuần túy. Bạn sẽ nhận được nhiều phản hồi hơn với việc gắn thẻ chung hơn. –

+14

Nó cũng trả lời câu hỏi cho những người tìm kiếm nó trong Obj-C. Đã thêm lại thẻ đó. – pbh101

Trả lời

7

Nếu bạn enum được định nghĩa như sau:

enum Direction { East, West, North, South}; 

Bạn có thể lặp qua nó theo cách này:

for (int direction = East; direction <= South; ++direction) 
{ 
    /* Do something with Direction 
} 
+0

Tôi chưa bao giờ làm điều này, vì vậy tôi có một số câu hỏi. Nó không phải là Direction.East và Direction.South? Cũng không nên là điều kiện hướng <= Direction.South? Một lần nữa tôi đã không bao giờ làm điều này, tôi không cố gắng sửa chữa bạn, chỉ muốn tìm hiểu. –

+3

Có cách nào tốt hơn để thực hiện việc này không? Chỉ cần tò mò, nhưng nó có vẻ như tùy thuộc vào thứ tự khai báo của các giá trị enum là mong manh nhất. –

+0

@blaenk: tôi nghĩ rằng bạn đang bối rối với cấu trúc enums. – pxl

36

Với

enum Foo {Bar=0,Baz,...,Last}; 

bạn có thể lặp lại các yếu tố như:

for(int i=Bar; i<=Last; i++) { 
    ... 
} 

Lưu ý rằng điều này cho thấy bản chất thực sự-chỉ-một-int của một enum C. Đặc biệt, bạn có thể thấy rằng một enum C không thực sự cung cấp an toàn kiểu, vì bạn có thể sử dụng một int thay cho một giá trị enum và ngược lại. Ngoài ra, điều này phụ thuộc vào thứ tự khai báo của các giá trị enum: mong manh để nói rằng ít nhất. Ngoài ra, xin vui lòng xem bình luận của Chuck; nếu các mục enum không tiếp giáp (ví dụ: vì bạn đã chỉ định các giá trị rõ ràng, không tuần tự cho một số mục), điều này sẽ không hoạt động chút nào. Yikes.

+8

Nó cũng đòi hỏi rằng tất cả các mục trong enum được tiếp giáp. Nhưng đó là điều tốt nhất bạn sẽ nhận được. – Chuck

+0

nó không nhận ra Foo trong looo cho tôi. – Frank

+6

Đó là một nitpick tinh khiết, nhưng nó được đánh vần 'ngược lại'. – new123456

8

Đó là một chút của một kludge (như là toàn bộ khái niệm nên ... eh ...) nhưng nếu bạn định làm điều này nhiều lần, và bạn muốn có khả năng đối phó với khả năng không các enums liên tục, bạn có thể tạo một mảng (hằng số toàn cục) và có (để sử dụng ví dụ của ennukiller) Hướng dẫn chỉ đường [4] = {Đông, Tây, Bắc, Nam}; và sau đó trong vòng lặp của bạn, bạn có thể nói về hướng [i] chứ không phải lặp lại trực tiếp qua chỉ mình ...

Như tôi đã nói, đó là xấu xí, nhưng nó hơi ít mong manh Tôi nghĩ ...

+0

Có vẻ tốt với tôi. Có cách nào mà chúng ta có thể thêm một số loại macro sẽ tự động tạo ra các mảng C cho chúng ta đối với từng kiểu enum mà chúng ta khai báo không? – ArtOfWarfare

+1

@ArtOfWarfare Tôi sử dụng tất cả các thời gian: '#define ENUM (loại, ...) enum _ ## type {__VA_ARGS__}; enum _ ## type type ## s [] = {__VA_ARGS__} ', mặc dù điều đó sẽ chỉ làm việc cho những người tiếp giáp. Tôi không sử dụng enums không tiếp giáp, bởi vì điều đó với tôi báo hiệu thiết kế xấu. Ngoài ra tôi có 'typedef struct _list List;', 'typedef enum _direction Direction' ở khắp mọi nơi trong mã C của tôi sử dụng macro này, đó là lý do tại sao tôi là tiền tố _ vào loại. 'ENUM (hướng, NORTH, EAST, SOUTH, WEST);' cho 'enum _direction {NORTH, EAST, SOUTH, WEST}; enum _direction directions = {NORTH, EAST, SOUTH, WEST}; 'Tôi thích nó. –

1

tôi thích những gì tôi nhận được từ đây Iteration over enum in Objective C?

typedef enum { ENUM1=0, ENUM2, ENUM3, ENUM4 , TOTAL } ; 


for (int i=ENUM1 ; i<TOTAL; i++) 
{} 

cách mà bạn có thể tiếp tục bổ sung enums sau này và không ảnh hưởng đến vòng của bạn?

5

Để tìm kiếm điều này, tôi vừa pha chế giải pháp sau đáp ứng các yêu cầu của riêng tôi. Tôi nghĩ rằng tôi sẽ đăng nó ở đây cho những người tìm kiếm một cái gì đó tương tự.

Giả sử tôi có enum.

typedef NS_ENUM (NSInteger, ISDirection) { 
    ISDirectionUp, 
    ISDirectionDown, 
    ISDirectionLeft, 
    ISDirectionRight 
}; 

Để có thể lặp lại, tôi xác định macro tiền xử lý sau.

#define ISDirectionAllAsDir ISDirection dir = ISDirectionUp; dir <= ISDirectionRight; dir++ 

Sau đó, tôi sử dụng nó bên trong một vòng lặp, như vậy:

for(ISDirectionAllAsDir) { 
    NSLog(@"Direction %d", dir); 
} 

này đặt logic cho lặp ở một nơi (vĩ mô) làm tăng đang bảo trì.

3

Đối với enums không tiếp giáp, bạn có thể duyệt qua các giá trị hợp lệ bằng cách thực hiện:

enum { 
    value_one = 0, 
    value_two = 1, 
    value_three = 3, 
    value_max 
} 
for (i = value_one; i < value_max; i++) 
{ 
    switch(i) 
    { 
     case value_one: 
     case value_two: 
     case value_three: 
     case value_four: 
     { 
      /* ... Do something with valid enum value ... */ 
     } 
     break; 
     default: 
      /* Found an invalid enum entry; ignore it */ 
     break; 
    } 
} 
+0

Trong trường hợp này, tôi sẽ không sử dụng vòng lặp nào cả. Chỉ cần để các khối hộp chuyển đổi cái khác, nó sẽ sạch hơn và đôi khi hiệu quả hơn. –

+0

Chắc chắn, tôi hoàn toàn đồng ý với bạn và tôi sẽ không viết điều này trong mã sản xuất; lý do duy nhất tôi bọc công tắc trong vòng lặp là bởi vì đó là những gì đã được hỏi bởi poster gốc;) –

2

Chiều dài (số mục) của bất kỳ liệt kê có thể được xác định chắc chắn bằng cách nhận các mảng tên trong kiểu liệt kê và sử dụng các chiều dài của mảng. Sử dụng phương thức GetNames của Enum. Enum.GetNames (enumType) .Length.

{ 
enum Pig { Snort, Sty, Oink, Curly }; 
const int Pig_Count = Enum.GetNames(typeof(Pig)).Length; 
} 
-3
enum direction = {South, North, East, West}; 

//this is used to loop through enum in the while loop, and will contain the enum length when the while loop finishes. 
int index = 0; 
while(direction[index] != null){ 
    index++; 
} 

//loop through all the values in the enum 
for (int i = 0; i < index; i++){ 
    //your code here, 'direction[index]' will return the enum name 
} 
+2

Bài gốc (OP) là về việc lặp qua các enums. Không có gì trong câu trả lời của bạn đề cập đến câu hỏi ban đầu. Vui lòng chỉnh sửa câu trả lời của bạn để giải quyết câu hỏi. – rothloup

+0

mã trên sẽ ghi lại mọi tên enum trong enum "direction". làm thế nào bây giờ điều này trả lời câu hỏi? – allanjwalter

+0

Có lẽ bạn nên thêm một số lời giải thích hoặc mã để chỉ ra rằng "hướng" là enum mà bạn đang đăng nhập. Có lẽ với một lập trình viên dày dạn nó rõ ràng từ mã của bạn, nhưng một người lập trình như vậy sẽ không đăng câu hỏi ngay từ đầu. Thêm một chút giải thích sẽ giúp làm rõ câu trả lời của bạn và làm cho nó hữu ích hơn cho bất kỳ ai đi qua nó. – rothloup

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