从API类生成readwrite变量,哪些变量是只读的

时间:2016-11-27 17:42:55

标签: objective-c encapsulation readonly getter-setter read-write

我正在尝试从API类中读取变量,其变量是 readonly

是否可以从那些只读变量中获取他们的setter?

请注意,由于私有API,我无法访问此类。

以下是一个例子:

私人APIAxes.h

@interface APIAxes

@property (nonatomic, readonly) double x;

@property (nonatomic, readonly) double y;

@property (nonatomic, readonly) double z; 

@end

My AxesClass.m

@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
}

2 个答案:

答案 0 :(得分:2)

如果此APIAxes课程没有初始值设定项,且没有设置者,那么听起来你真的不应该尝试这样做。假设该类似乎是一个伪结构,一个可以放入NS集合的简单数据对象,但是没有保证APIAxes实例一旦被传递就不会改变对你而言,你很有可能通过追逐价值来造成神秘的图书馆内部问题。如果图书馆作者已经解释了这一点,他们就会提供制定者,或者至少是构造函数。

现在,已经给出了拍摄警告......您应该能够使用键值编码来修改这些值。我说"应该"因为,正如Itai Ferber在下面所说,它依赖于一个特定的命名惯例,并且可以实现一个类,以便KVC不会工作。但是声明的属性是在考虑KVC的情况下实现的,所以如果它们是标准属性,那么你就完全了。

KVC甚至可以在没有设置器的情况下更改属性值:如果需要,它将通过ObjC运行时库找到ivar本身。唯一需要注意的是,由于这些属性是基元,因此您需要先将新值包装到NSNumber中。

所以[temp setValue:@(0.1) forKey:@"x"];应该做到这一点。

答案 1 :(得分:0)

是的,因为APIAxes将属性定义为只读,所以你的双手被捆绑了。一般来说,他们会给你一个初始化方法,它接受设置这些属性的参数,但似乎并非如此?