【问题标题】:Make readwrite variables from an API class which variables are readonly从 API 类中创建读写变量,这些变量是只读的
【发布时间】:2016-11-27 17:42:54
【问题描述】:

我正在尝试 readwrite 来自 API 类的变量,这些变量是 readonly

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

请注意,我无法访问这些类,因为它们来自私有 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 alloc] init];
  • 乔希的回答是正确的,尽管我认为需要一个更大的免责声明;这样做几乎肯定是错误的。这些属性是readonly 是有原因的,并且更改值可能会破坏许多内部 API 假设;结果可能是错误的,甚至是危险的。如果您没有可用的初始化程序来创建您自己的 APIAxes 值,我猜APIAxes 值要么被 API 出售(在这种情况下,您误用了该类型,应该创建自己的),或者传入(在这种情况下,您不应提供任意数据)。
  • 我想我的问题是,你能澄清一下为什么你认为你需要这样做吗?可能有更好的方法来解决这个问题。

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


【解决方案1】:

如果这个APIAxes 类没有初始化程序,也没有setter,那么听起来你真的不应该尝试这样做。假设该类似乎是一个伪结构,一个可以放入 NS 集合中的简单数据对象,但没有保证 APIAxes 实例一旦被分发给您就不会改变,您站在一个很好的位置通过对值进行胡闹而引起神秘的图书馆内部问题的机会。如果图书馆作者考虑到了这一点,他们就会提供 setter,或者至少是一个构造函数。

现在,已经给出了脚射警告......您应该能够使用键值编码来修改这些值。我说“应该”是因为,正如 Itai Ferber 在下面指出的那样,它依赖于特定的命名约定,并且可以实现一个类以使 KVC 不起作用。但是声明的属性是在考虑 KVC 的情况下实现的,所以如果这些是标准属性,那么一切就绪。

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

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

【讨论】:

  • 当然,请记住,如果该类不符合 KVC,那么您几乎就是 SOL。如果该类具有自定义 ivars(例如,x 的 ivar 未命名为 x_x,即使 @synthesize'd),KVC 将在 -setValue:forKey: 上抛出异常。这在当今时代非常罕见,但有可能;我想如果你想写一个真正反对这种颠覆的类......
  • 是的,我应该明确表示,@ItaiFerber,谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多