从 API class 中创建读写变量,哪些变量是只读的

Make readwrite variables from an API class which variables are readonly

我正在尝试 readwrite 来自 API class 的变量 readonly

是否可以从那些只读变量中获取它们的设置器?

请注意,我无法访问此 classes,因为它来自私人 API。

这是一个例子:

私人 APIAxes.h

@interface APIAxes

@property (nonatomic, readonly) double x;

@property (nonatomic, readonly) double y;

@property (nonatomic, readonly) double z; 

@end

我的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
}

是的,因为 APIAxes 将属性定义为只读,您的手脚被束缚了。通常他们会给你的是一个初始化方法,它接受设置这些属性的参数,但情况似乎并非如此?

如果这个 APIAxes class 没有初始化器,也没有 setter,那么听起来你真的不应该尝试这样做。假设 class 看起来是一个伪结构,一个可以放入 NS 集合的简单数据对象,但不能保证 APIAxes 实例一旦被分发到就不会改变你,你很有可能通过改变价值观来引起神秘的图书馆内部问题。如果图书馆作者考虑到了这一点,他们会提供 setters,或者至少是一个构造函数。

现在,发出警告后...您应该能够使用键值编码来修改这些值。我说 "should" 是因为,正如 Itai Ferber 在下面指出的那样,它依赖于特定的命名约定,并且可以实现 class 这样 KVC 就无法工作。但是声明的属性是在考虑 KVC 的情况下实现的,因此如果这些是标准属性,您就已经准备好了。

KVC 可以更改 属性 值,即使没有 setter:它会在必要时通过 ObjC 运行时库找到 ivar 本身。唯一需要注意的是,由于这些属性是原始属性,因此您需要先将新值装箱到 NSNumbers 中。

所以 [temp setValue:@(0.1) forKey:@"x"]; 应该可以解决问题。