我正在尝试从API类中读取变量,其变量是 readonly
是否可以从那些只读变量中获取他们的setter?
请注意,由于私有API,我无法访问此类。
以下是一个例子:
@interface APIAxes
@property (nonatomic, readonly) double x;
@property (nonatomic, readonly) double y;
@property (nonatomic, readonly) double z;
@end
@property (nonatomic) APIAxes *apiA;
- (void)updateAxes
{
APIAxes *temp = [APIAxes alloc];
temp.x = 0.1; //Error x variable is readonly
temp.y = 0.2; //Error y variable is readonly
temp.z = 0.3; //Error z variable is readonly
self.apiA = temp; // This works
}
答案 0 :(得分:2)
如果此APIAxes
课程没有初始值设定项,且没有设置者,那么听起来你真的不应该尝试这样做。假设该类似乎是一个伪结构,一个可以放入NS集合的简单数据对象,但是没有保证APIAxes
实例一旦被传递就不会改变对你而言,你很有可能通过追逐价值来造成神秘的图书馆内部问题。如果图书馆作者已经解释了这一点,他们就会提供制定者,或者至少是构造函数。
现在,已经给出了拍摄警告......您应该能够使用键值编码来修改这些值。我说"应该"因为,正如Itai Ferber在下面所说,它依赖于一个特定的命名惯例,并且可以实现一个类,以便KVC不会工作。但是声明的属性是在考虑KVC的情况下实现的,所以如果它们是标准属性,那么你就完全了。
KVC甚至可以在没有设置器的情况下更改属性值:如果需要,它将通过ObjC运行时库找到ivar本身。唯一需要注意的是,由于这些属性是基元,因此您需要先将新值包装到NSNumber
中。
所以[temp setValue:@(0.1) forKey:@"x"];
应该做到这一点。
答案 1 :(得分:0)
是的,因为APIAxes
将属性定义为只读,所以你的双手被捆绑了。一般来说,他们会给你一个初始化方法,它接受设置这些属性的参数,但似乎并非如此?