Câu hỏi đầu tiên là phạm vi bạn muốn các hằng số của bạn có, đây thực sự là hai câu hỏi:
- Là các hằng số cụ thể cho một lớp duy nhất, hoặc nó có ý nghĩa để có tất cả chúng trên ứng dụng?
- Nếu chúng là đặc thù của lớp, chúng được sử dụng bởi các khách hàng của lớp, hoặc chỉ trong lớp?
Nếu chúng là cụ thể và nội bộ cho một lớp duy nhất, hãy khai báo chúng static const
ở đầu tệp .m, như vậy:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Nếu chúng liên quan đến một lớp duy nhất nhưng phải được công khai / sử dụng bởi các lớp khác, hãy khai báo chúng như extern
trong tiêu đề và định nghĩa chúng trong .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Nếu chúng phải là toàn cục, hãy khai báo chúng trong một tiêu đề và xác định chúng trong một mô-đun tương ứng, đặc biệt cho các hằng số đó.
Bạn có thể trộn và kết hợp chúng cho các hằng số khác nhau với các mức độ khác nhau về mức độ toàn cầu mà bạn muốn chúng tồn tại và đối với các hằng số toàn cầu khác nhau đơn giản không thuộc về nhau, bạn có thể đặt chúng vào các mô-đun riêng biệt, mỗi mô-đun có tiêu đề riêng, nếu bạn muốn
Tại sao không #define
?
Câu trả lời cũ là các macro macro không có thông tin kiểu, nhưng các trình biên dịch ngày nay khá thông minh trong việc thực hiện tất cả các loại kiểm tra chữ (các macro mở rộng thành) cũng như các biến.
Câu trả lời hiện đại là vì trình gỡ lỗi sẽ không biết về macro của bạn. Bạn không thể nói [myThing addObserver:self forKey:MyThingNotificationKey]
trong lệnh gỡ lỗi nếu MyThingNotificationKey
là macro; trình gỡ lỗi chỉ có thể biết về nó nếu nó là một biến.
Tại sao không enum
?
Vâng, rmaddy đã đánh bại tôi trong phần bình luận: enum
chỉ có thể định nghĩa các hằng số nguyên. Những thứ như số định danh nối tiếp, mặt nạ bit, mã bốn byte, v.v.
Đối với những mục đích đó, enum
là tuyệt vời và bạn hoàn toàn nên sử dụng nó. (Thậm chí tốt hơn, sử dụng các macro NS_ENUM
vàNS_OPTIONS
.) Đối với những thứ khác, bạn phải sử dụng một cái gì đó khác; enum
không làm gì ngoài số nguyên.
Và những câu hỏi khác
Tôi đã suy nghĩ về việc nhập tệp trong tệp Reddit-Prefix.pch để cung cấp các hằng số có sẵn cho tất cả các tệp. Đó có phải là một cách tốt để làm việc?
Có lẽ vô hại, nhưng có lẽ quá mức. Nhập (các) tiêu đề hằng của bạn, nơi bạn cần chúng.
Các trường hợp sử dụng cho mỗi giải pháp đó là gì?
#define
: Khá hạn chế. Tôi thực sự không chắc chắn có lý do chính đáng để sử dụng điều này cho các hằng số nữa.
const
: Tốt nhất cho hằng số địa phương. Ngoài ra, bạn phải sử dụng điều này cho một cái bạn đã khai báo trong một tiêu đề và hiện đang xác định.
static const
: Tốt nhất cho các hằng số dành riêng cho tệp (hoặc lớp cụ thể).
extern const
: Bạn phải sử dụng điều này khi xuất một hằng trong tiêu đề.
Ngoài ra, nếu sử dụng extern const
, tôi có cần nhập tệp không, hoặc các hằng số sẽ có sẵn trên toàn cầu mà không cần nhập tệp?
Bạn cần nhập tệp, trong mỗi tệp mà bạn sử dụng hoặc trong tiêu đề tiền tố.