我有一个名为Constants的Singleton类,我需要在那里设置一些应用程序范围的常量。我喜欢这些常数只是readonly。所以我在Constants.h文件中执行了以下操作
@interface Constants : NSObject
{
}
@property (nonatomic, readonly)double U_LAT;
@property (nonatomic, readonly)double U_LNG;
然后在我的.m文件中我得到了这个方法
-(id)init
{
self = [super init];
self.U_LAT = 49.2765;
self.U_LNG = -123.2177;
return self;
}
我从此代码中收到此错误:
Assignment to readonly property
我可以不在init方法中初始化我的readonly变量吗?如果不是我如何初始化它们?
答案 0 :(得分:10)
self.propertyName = val;
与[self setPropertyName:val];
相同 - 它需要存在setter方法。只读属性没有setter方法。
您可以设置直接支持该属性的ivar,但是:
-(id)init
{
self = [super init];
_U_LAT = 49.2765;
_U_LNG = -123.2177;
return self;
}
如果您允许自动合成属性,则ivar的名称将是以下划线为前缀的属性名称。如果您有明确的@synthesize propName;
,则ivar将具有相同的名称。您还可以使用合成语句创建具有您喜欢的任何名称的变量:@synthesize cat = dog;
该财产也可以是公开的只读,但可由该类写入;这涉及在类扩展中声明一个setter方法或redeclaring the property in the extension。
答案 1 :(得分:5)
我认为更好的方法是在私有界面中重新声明属性,如下所示:
// .h
@interface Constants : NSObject
@property(nonatomic, readonly) double U_LAT;
@end
// .m
@interface Constants ()
@property(nonatomic, readwrite) double U_LAT;
@end
是的,在inits和dealloc中,直接将变量称为_U_LAT。
答案 2 :(得分:0)
最好还是将它们声明为属性而不是常量。
在.h
文件中,在@interface
:
extern double const U_LAT;
extern double const U_LNG;
然后在.m
文件中,在@interface
:
double const U_LAT = 49.2765;
double const U_LNG = -123.2177;
导入U_LAT
的任何类都可以使用U_LNG
和Constants.h
,而且您不必处理属性或接口。
正是这种事情发生了const
。