2012-02-29 37 views
5

Tôi có một số UIPopoverViewControllers gửi tin nhắn để ủy quyền UIViewControllers để chuyển các sự kiện giao diện người dùng. Thay vì viết một phương thức riêng biệt cho mỗi sự kiện, tôi có một phương thức trong ủy nhiệm với một câu lệnh switch để xác định cách xử lý sự kiện dựa trên một hằng số được truyền (ví dụ bên dưới).cách chia sẻ hằng số (enums) giữa các lớp?

Đây có lẽ là thiết kế kém nhưng đó là những gì tôi đã đưa ra. Tôi đã nhìn thấy this câu hỏi liên quan đến enums hoặc các lớp học tĩnh nhưng không hiểu câu trả lời.

Vì vậy, đó là những gì tôi đang làm BAD và có cách nào tôi có thể xác định enums ở một nơi không?

EDIT Được rồi, tìm hiểu thêm một chút (here + here) Tôi thấy rằng tôi có thể đang đi đúng hướng. Vì vậy, tôi đoán tôi cần phải biết những gì và nơi một tập tin implementation là trong iOS.

enum { 
kSetPlaybackType = 0, 
kSetAllNotesOn, 
kSetAllNotesOff, 
kSetVelocity, 
kSetDuration 
}; 

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch (action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
     if (playbackType == kPalindrome){ 
      palindromeDirection = kPalindromeUp; 
     } 
     break; 

    case kSetAllNotesOn: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = YES; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetAllNotesOff: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = NO; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetVelocity: 
     for (BarNote* note in self.barNoteArray) { 
      note.velocity = [param intValue]; 
     } 
     break; 

    case kSetDuration: 
     for (BarNote* note in self.barNoteArray) { 
      note.duration = [param floatValue]; 
     } 
     break; 

    default: 
     break; 
} 
} 

Trả lời

14

Tôi sẽ không nói rằng cách tiếp cận của bạn là phải là xấu, nhưng nó vẫn có một cảm giác nhẹ với nó của phôi thai bắt đầu của một phương pháp "thần" - đó là một phương pháp mà cố gắng làm mọi điều. Tuy nhiên đối với số lượng các lựa chọn bạn có trong mã tôi muốn nói rằng nó hoàn toàn tốt đẹp.

Nhưng chia sẻ xung quanh enum là rất dễ dàng. Chỉ cần đặt chúng trong tập tin .h của riêng mình và nhập nó ở nơi cần thiết. Bạn có thể bao gồm tệp .h dưới dạng một trong các loại tệp trong phần "C & C++".

Câu hỏi mà bạn đã tham chiếu là C#, và một thứ họ đã làm bằng ngôn ngữ đó là thiết kế các tệp .h tương đương và chỉ sử dụng câu lệnh "sử dụng" để xác định đúng biểu tượng. Trong Objective-C (như trong C và C++), bạn phải làm một công việc thủ công hơn một chút để đạt được điều tương tự.

Bằng cách này, tôi sẽ ăn mặc enum tăng nhẹ hơn như:

typedef enum { 
    kSetPlaybackType = 0, 
    kSetAllNotesOn, 
    kSetAllNotesOff, 
    kSetVelocity, 
    kSetDuration 
} SetEnumType; 

Bằng cách khai báo enum trong một typedef, bạn có được khả năng để khai báo các biến của loại đó. Tức là thay vì:

int varName = kSetAllNotesOn; 

Bạn có thể nói:

SetEnumType varName = kSetAllNotesOn; 

Điều này cho phép gợi ý thêm để XCode khi trình bày cho bạn lựa chọn autocomplete, và nó làm cho nó ngữ nghĩa tốt hơn để đọc như một con người, như bạn đã biết rằng varName có nghĩa là để giữ một enum và không chỉ bất kỳ số cũ.

Nhược điểm là bạn có thể cần phải rõ ràng truyền varNum giữa loại enum và loại int tùy thuộc vào những gì bạn đang làm.

Tuy nhiên tôi không chắc chắn nếu bạn có thể khai báo các phương pháp chữ ký của bạn như

- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param 

Tôi đoán bạn sẽ có thể (như tôi nghĩ enum được hỗ trợ bởi một int).Nhưng nếu bạn không thể, thì bạn nên làm tốt nhất là

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch ((SetEnumType)action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
+0

Ngoài ra, một trong những điều anh nên làm là đặt tên enum bằng cách sử dụng 'typedef' và không sử dụng' int' làm tham số, khi enum quy định được mong đợi. – Sulthan

+0

@Sulthan Tôi đã làm điều đó khi bạn nhận xét: D –

+0

Điều này thật tuyệt - cảm ơn! Tôi đã thêm tên hằng số typedef +, và di chuyển các enum defs thành một tập tin .h. Đã có thể sử dụng typedef trong phương thức sig của tôi. '- (void) barPropertyAction: (kBarProperty) action vớiParam: (NSNumber *) param;' –

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