Objective-C属性,它是公开的只读属性,但具有私有setter
我想使用Objective-C属性,它是公开的只读属性,但具有私有setter,objective-c,properties,Objective C,Properties,我想使用@property语法来声明一个合成属性,该属性是公开只读的,但有一个setter,可以从类内私下调用 由于它是Objective-C,这基本上意味着将合成setFoo:方法,但在类本身之外调用它将导致警告(无法识别的选择器)。要触发警告,我必须声明属性只读;有没有办法强制合成一个只能在类中使用的setter?我想你要找的是类扩展。您将在标题中声明属性为只读: @interface MyClass : NSObject { } @property (readonly, assign)
@property
语法来声明一个合成属性,该属性是公开只读的,但有一个setter,可以从类内私下调用
由于它是Objective-C,这基本上意味着将合成
setFoo:
方法,但在类本身之外调用它将导致警告(无法识别的选择器)。要触发警告,我必须声明属性只读
;有没有办法强制合成一个只能在类中使用的setter?我想你要找的是类扩展。您将在标题中声明属性为只读:
@interface MyClass : NSObject {
}
@property (readonly, assign) NSInteger myInteger;
@end
然后在实现文件中重新声明类扩展名:
@interface MyClass ()
@property (readwrite, assign) NSInteger myInteger;
@end
@implementation MyClass
@end
要了解更多信息,请查看苹果的我可能会迟到,但没有延长时间,我使用了以下技术
@interface MyClass : NSObject {
NSString * name;
}
@property (readonly, strong) NSString * name;
@end
另一方面在实现文件中
@implementation MyClass
@synthesize name;
- (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{
name = @"abc";
}
return self;
}
@end
这样做将设置您的值,并可作为只读访问。
谢谢。您说得对,另请参见这是一种在保持必要封装的同时利用属性便利性的好方法。:)喜欢这个功能。更新的文档链接:有人真的测试过这个吗?尝试使用点表示法设置属性会导致编译器错误(良好),但使用setMyInteger:方法只会收到编译器警告,并且当应用程序运行时,“readonly”属性确实会更改。@jk7这是正确的行为;编译器告诉你你做错了。运行时可以“自由”违反这一点。