Làm thế nào để bạn khởi tạo một hằng số trong một tệp tiêu đề?Các hằng số được khởi tạo trong các tệp tiêu đề Objective-C như thế nào?
Ví dụ:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Làm thế nào để bạn khởi tạo một hằng số trong một tệp tiêu đề?Các hằng số được khởi tạo trong các tệp tiêu đề Objective-C như thế nào?
Ví dụ:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Đối với các hằng số "công cộng", bạn khai báo nó như extern
trong tập tin tiêu đề của bạn (.h) và khởi tạo nó trong tập tin thực thi của bạn (.m).
// File.h
extern int const foo;
sau đó
// File.m
int const foo = 42;
Xem xét sử dụng enum
nếu nó không chỉ là một, nhưng nhiều hằng số thuộc cùng
lớp C Mục tiêu không hỗ trợ hằng như các thành viên. Bạn không thể tạo một hằng số theo cách bạn muốn.
Cách gần nhất để khai báo hằng số liên kết với một lớp là xác định phương thức lớp trả về nó. Bạn cũng có thể sử dụng extern để truy cập trực tiếp các hằng số. Cả hai được thể hiện dưới đây:
// header
extern const int MY_CONSTANT;
@interface Foo
{
}
+(int) fooConstant;
@end
// implementation
const int MY_CONSTANT = 23;
static const int FOO_CONST = 34;
@implementation Foo
+(int) fooConstant
{
return FOO_CONST; // You could also return 34 directly with no static constant
}
@end
Ưu điểm của phiên bản phương thức lớp là có thể mở rộng để cung cấp các đối tượng liên tục khá dễ dàng. Bạn có thể sử dụng các đối tượng bên ngoài, nut bạn phải khởi tạo chúng trong một phương thức khởi tạo (trừ khi chúng là các chuỗi). Vì vậy, bạn sẽ thường thấy các mô hình sau:
// header
@interface Foo
{
}
+(Foo*) fooConstant;
@end
// implementation
@implementation Foo
+(Foo*) fooConstant
{
static Foo* theConstant = nil;
if (theConstant == nil)
{
theConstant = [[Foo alloc] initWithStuff];
}
return theConstant;
}
@end
Một cách đơn giản cho kiểu giá trị hằng số như số nguyên là sử dụng enum hack như ám bởi unbeli.
// File.h
enum {
SKFoo = 1,
SKBar = 42,
};
Một lợi thế cho việc này bằng cách sử dụng extern
là tất cả đều được giải quyết lúc biên dịch nên không cần bộ nhớ để giữ các biến.
Phương pháp khác là sử dụng static const
đó là những gì đã được thay thế cho enum hack trong C/C++.
// File.h
static const int SKFoo = 1;
static const int SKBar = 42;
Quét nhanh qua tiêu đề của Apple cho thấy phương pháp enum hack dường như là cách ưa thích thực hiện điều này trong Mục tiêu-C và tôi thực sự thấy rõ hơn và sử dụng nó.
Ngoài ra, nếu bạn đang tạo nhóm tùy chọn, bạn nên cân nhắc sử dụng NS_ENUM
để tạo hằng số an toàn.
// File.h
typedef NS_ENUM(NSInteger, SKContants) {
SKFoo = 1,
SKBar = 42,
};
Thông tin thêm về NS_ENUM
và đó là anh em họ NS_OPTIONS
có sẵn tại NSHipster.
Nếu tôi cần 'typedef NS_ENUM' thì sao? – ManuQiao