从init返回另一个对象

时间:2012-02-16 19:43:38

标签: iphone objective-c macos initialization

我使用符合obj c协议的对象来表示计算。有常量[1],变量[x]和操作[a + b]。所有这些对象都是不可变的(变量包含一个键(到字典)和一个默认值(如果字典不包含键的值,则使用)。

由于对象是不可变的,我想在初始化对象时尽可能简化计算。 (注意:允许变量字典不断更改,因此我永远无法根据变量的值进行简化,只能使用常量)。

例如,一个非常常见的用法是将变量增加1:[[x] +1]。当这些嵌套时,我想从init而不是[[[x] +1] +1]返回[[x] +2],这样计算的那部分只需要完成一次。到目前为止一切都很好。

当两个参数都是常量(例如[2 + 2])时,返回[4]是有意义的。但ARC抱怨这一点,因为[4]是一个坚持同一协议的不同类。

让我想到我想做的是好形式。我通常会将它们全部从单个类(类集群)继承,但我想使用NSNumber(通过类别扩展)作为常量。

我可以将简化逻辑移动到另一个方法,但这意味着必须经常分配额外的对象,我必须记住总是调用它:[[[MyClass alloc] init] simplifiedCalc]。

我的选择是:

  1. 只需使编译器静音(并在中编写完整的注释) 文件)
  2. 创建并调用单独的“简化”方法 返回另一个对象(创建额外的对象)
  3. 执行返回同一对象的优化 在init中(例如[[[x] +1] +1] - > [[x] +2]),但需要“简化” [2 + 2] = [4]情况的方法。
  4. ???
  5. 感谢任何想法或建议。

1 个答案:

答案 0 :(得分:2)

而不是在init中执行此工作,也许您应该只有一个方便的方法来设置未简化的表达式,然后通过并简化它并返回简化的表达式。或者您可以将此作为对象本身的方法,例如

@protocol Calculation
- (id<Calculation>)simplifiedExpression;
@end

如果已经简化,则可以返回self,如果没有,则可以构建新的简化版本。这样你仍然可以像现在一样分配/初始化你的对象,然后再简化它们。你甚至可以创建一个兼具两者的便利构造函数:

+ (id<Calculation>)simplifiedCalculationWithInput:(id)input;