2009-06-10 23 views
13

Tôi mới đến Obj-C để tha thứ cho tôi nếu đây là một câu hỏi ngu ngốc:Lớp phong cách Java-enum trong Mục tiêu-C?

Làm thế nào để thực hiện một số trong phong cách của enums Javas? Hoặc chính xác hơn:

Tôi muốn một lớp học có một số thuộc tính đã biết được khắc phục vào thời gian biên dịch và duy nhất cho mỗi trường hợp. Ngoài ra, tôi chỉ muốn một loại cá thể.

Để tôi cho một ví dụ trong Java:

public enum MessageTypes { 
    DEFAULT("white", "standard", 1), 
    EXPRESS("red", "expressMessage", 2), 
    BORADCAST("green", "broadcast", 3); 

    String color; String tagName; int dbId; 
    MessageTypes(String color, String tagName, int dbId) { 
    // you get the idea 
    } 
    //some methonds like getEnumByTagName 
} 

Làm thế nào bạn sẽ làm điều gì đó như thế này trong Objective-C? Tui bỏ lỡ điều gì vậy? Đây có phải là một mô hình xấu?

Cảm ơn trước!

EDIT: Tôi xin lỗi, nếu tôi không tự làm rõ. Tôi biết, rằng enj-c enums không phải là những gì tôi đang tìm kiếm (vì họ chỉ nhỉnh hơn một typedef đến một int).

Tôi muốn tạo một tập hợp các thể loại (loại đơn lẻ, không thay đổi) của một lớp cụ thể. Mẫu đơn trong Apples Dev-Docs không được sử dụng vì tôi muốn có nhiều cá thể riêng biệt của một lớp với mỗi giá trị riêng lẻ trong các thuộc tính của chúng.

Mục đích của việc này là có nhiều loại Tin nhắn (khoảng 20) có thể được gán cho một Tin nhắn làm tài sản. Mỗi loại Tin nhắn của tôi có màu (sửa và được xác định trước), thuộc tính-giá trị (trong một biểu diễn XML) và một số ID.

Trong Java, tôi sẽ sử dụng một enum như trong mẫu mã của tôi. Nhưng làm cách nào để tạo các MessageTypes khác nhau và liên kết chúng với các thuộc tính của chúng trong Obj-C?

Tạo 20 Sublcasses của MessageType (mỗi một singleton-instance giữ các thuộc tính) có vẻ như rất nhiều công việc cho một nhiệm vụ đơn giản như vậy và tổng số quá mức cần thiết.

Cách tiếp cận hiện tại của tôi là tạo một lớp với NSArray chứa các phiên bản khác nhau. Lên trên truy cập đầu tiên của một phương thức như +(id)messageTypeForId:NSInteger id_ NSArray được chuẩn bị sẵn. Nhưng điều này cảm thấy hoàn toàn vụng về và không hoàn toàn thanh lịch ...

Có cách tiếp cận thỏa mãn hơn không?

Trả lời

7

Không có nhiều cách để "tiếp cận thỏa mãn hơn".

Các mô hình ca cao bình thường sẽ tạo ra các phương pháp như:

+ (MessageTypes*) sharedDefaultMessageType; 
+ (MessageTypes*) sharedExpressMessageType; 
+ (MessageTypes*) sharedBroadcastMessageType; 
etc 

và sau đó thực hiện chúng một cái gì đó như:

+ (MessageTypes*) sharedDefaultMessageType 
{ 
    static MessageTypes* thisMessageType = nil; 
    if (!thisMessageType) { 
     thisMessageType = [[MessageTypes alloc] initWithColor:@"white" tagName:@"standard" dbId:1]; 
    } 
    return thisMessageType; 
} 

Ngoài ra, lưu trữ chia sẻ MessageType * trong một NSMutableArray hoặc NSMutableDictionary hoặc precalculating họ như bạn đang làm là tất cả các approraches hợp lệ như nhau.

Lưu ý rằng "mẫu" phương pháp trên có thể được tạo ra thông qua một macro như vậy mà bạn có thể viết trong file .m:

CREATEMESSAGETYPE(Default, @"white", @"standard", 1) 
CREATEMESSAGETYPE(Express, @"red", @"expressMessage", 2) 
CREATEMESSAGETYPE(Broadcast, @"green", @"broadcast", 3) 

đó có thể là "thỏa mãn hơn", hay xấu xí hơn, tùy thuộc vào bạn quan điểm.

+0

Macro càng xấu trong quan điểm của tôi nhưng tôi thực sự thích giải pháp đầu tiên của bạn. Điều đó có vẻ tốt hơn (và nhiều ca cao hơn) so với cách tiếp cận của tôi. Cảm ơn bạn. –

+0

Tôi thấy cách 'mặc định' và' chia sẻ' được sử dụng bởi quy ước trong một số lớp, có các tiền tố khác như thế không? – zekel

+0

Trong giải pháp đầu tiên của bạn, tại sao bạn kiểm tra nếu thisMessageType là không trước khi gọi phân bổ? Không phải lúc nào cũng không phải vì dòng trước nó? Thx để giúp đỡ một newbie. –

1

Tôi nghĩ rằng tôi chỉ muốn sử dụng một C enum tiêu chuẩn:

typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType; 

Sau đó, bạn chỉ cần sử dụng nó như là bạn với bất kỳ loại dữ liệu khác:

@interface Blah {} 

-(void) setMessageType:(MessageType)newMessageType; 

@end 
+4

Vâng, sau đó tôi không có thuộc tính của mình, đó là duy nhất cho mỗi trường hợp. –

0

Enums không đối tượng trong C, và do đó không có trong Objective-C. Chúng chỉ là các scalars do người dùng xác định có một bộ giới hạn các giá trị được đặt tên mà chúng có thể thực hiện. Bạn có thể cung cấp cho một thuộc tính đối tượng là loại enum, mà tôi nghĩ là gần nhất với những gì bạn đang tìm kiếm.

Nếu có điều gì đó cụ thể mà bạn cần phải thực hiện với chức năng này, bạn có thể muốn chỉnh sửa bài đăng của mình để cho biết đó là gì.

0

Tôi đã có cùng một câu hỏi nhiều hơn hoặc ít hơn nhưng tìm tất cả các giải pháp ở trên vụng về phong cách. Đặc biệt khi chỉ đơn giản là sử dụng một tài sản enum C trên một đối tượng bạn bị mất ngữ nghĩa singleton của Java enums. Sự tự do lớn nhất mà tôi đã tìm thấy trong việc sử dụng các enum Java là các cá thể của một enum thực sự là các lớp con đơn, và do đó tham gia vào phương thức đa hình. Thậm chí mạnh hơn enums với các thuộc tính duy nhất là enums với hành vi đa hình.

Cho rằng đây là tính năng chính tôi sẽ làm sau khi một lớp lớp Objective-C với các lớp con riêng đơn lẻ là một cách tiếp cận với hành vi mong muốn, mặc dù hơi cao hơn chi phí thực hiện và độ phức tạp?

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