2012-04-07 41 views
5

Tôi vừa đọc tất cả các biến số toàn cầu mục tiêu-c toàn cầu Q & A nhưng tôi thấy chúng không phù hợp với vấn đề của tôi.Tạo danh sách hằng số biến từ các hằng số khác

Tôi cần một danh sách các biến như thế này:

NSString *baseURL = @"http://example.org"; 
NSString *mediaURL = @"http://example.org/media/"; 
NSString *loginURL = @"http://example.org/login/"; 
NSString *postURL = @"http://example.org/post/"; 
etc. 

Tất nhiên là tôi không thể sử dụng đoạn mã này vì đó là một cách tiếp cận rất xấu và nếu tôi cần phải thay đổi địa chỉ cơ sở tôi phải thay đổi tất cả các biến. Vì tôi cần những biến để được truy cập từ mọi tầng lớp của ứng dụng Tôi tuyên bố chúng như toàn cầu với phương pháp này:

// Constants.h 
extern NSString *const baseURL; 
extern NSString *const mediaURL; 
extern NSString *const loginURL; 
extern NSString *const postURL; 


// Constants.m 
NSString *const baseURL = @"http://example.org"; 
NSString *const mediaURL = [NSString stringWithFormat:"%@%@", baseURL, @"/media/"]; 
NSString *const loginURL = [NSString stringWithFormat:"%@%@", baseURL, @"/login/"]; 
NSString *const postURL = [NSString stringWithFormat:"%@%@", baseURL, @"/post/"]; 

NHƯNG tôi không thể làm điều này bởi vì tôi gặp lỗi này:

Initializer element is not a compile-time constant 

Điều này xảy ra vì các đối tượng hoạt động trong thời gian chạy.

Bây giờ câu hỏi của tôi là, một lần và cho tất cả tôi hy vọng, một cách tốt đẹp và tốt để xử lý kịch bản khá bình thường này trong các ứng dụng mạng là gì?

Tôi nghĩ rằng sử dụng một lớp (hoặc một lớp singleton) để xử lý các biến hằng số là một chút quá mức cần thiết, và nó cũng quá tiết sử dụng một cái gì đó như [MyClass globalVar] mỗi khi tôi cần nó.

Ý tưởng về nó?

Trả lời

4

Tôi biết nó đã lỗi thời nhưng tôi chỉ sử dụng các macro tiền xử lý và cho phép nối chuỗi liên tục để xử lý nó.

#define baseURL @"http://example.org" 
#define mediaURL [email protected]"/media/" 
+0

Uhm, không xấu ạ. Vì vậy, trong trường hợp này tôi chỉ cần một tệp .h, phải không? –

+0

@FredCollins yes .. –

+0

Có. Các định nghĩa chỉ là thay thế trước khi biên dịch chữ. (Mặc dù, để được bán tiêu chuẩn, người ta có thể đổi tên chúng thành FC_BASE_URL và FC_MEDIA_URL hoặc một cái gì đó sắp xếp.) –

0

Tôi không có quyền truy cập vào một MAC bây giờ ... bạn có thể chỉ cần cố gắng này ..

trong .h

NSString *baseURLString; 
extern NSString *const baseURL; 

trong .m

baseURLString= @"http://example.org"; 
NSString *const baseURL= [NSString stringWithFormat:"%@", baseURL]; 

Tôi không chắc chắn về điều này sẽ hoạt động ..

Và cũng có bạn nhìn thấy câu trả lời này tại SO ... nó có tất cả các phương pháp tôi biết ... Constants in Objective-C

+0

Không, nó không hoạt động vì lý do tương tự mà tôi đã trích dẫn trong câu hỏi. Dù sao cũng cảm ơn bạn. –

2
#define API_ROOT_URL @"https://www.example.org/api" 
NSString *const OAuthUrl = API_ROOT_URL @"/oauthToken"; 

See also.