【问题标题】:computed property in objective c目标 c 中的计算属性
【发布时间】:2016-06-04 22:31:47
【问题描述】:

我正在尝试通过复制 this 教程在 Objective-C 中制作一个旋转轮。但我不知道如何在目标 c 中转换 swift 的计算属性。如何在 Objective-C 中声明半径变量,如下面的代码,我可以在计算变量中调用 invalidateLayout 方法?

var radius: CGFloat = 500 {
  didSet {
    invalidateLayout()
  }
}

【问题讨论】:

标签: ios objective-c swift computed-properties


【解决方案1】:

严格来说,您的示例不是计算属性

无论如何,Objective-C 等价物是

@property (assign, nonatomic) CGFloat radius;

有时通过实例变量设置初始值,以获得在初始化时不调用invalidateLayout方法的行为。

_radius = 500.0;

并实现setter

- (void)setRadius:(CGFloat)radius
{
  if (_radius != radius) {
    _radius = radius;
    [self invalidateLayout];
  }
}

如果您需要始终调用invalidateLayout,即使值没有改变,请删除if 检查。

【讨论】:

  • 另外,如果你实现了一个setter,你也需要实现一个getter,因为它不会被自动合成。
  • 好点,谢谢,但 AFAIK getter 是自动合成的。
  • 你只是破坏了正确的答案,并把它弄错了。自动 KVO 支持由 NSObject 提供,默认情况下可用于符合键值编码的类的所有属性。所以你不需要实现 will/didChangeValueForKey。此外,如果你这样做,你还应该实现automaticallyNotifiesObserversForKey:
  • 感谢@BorisVerebsky 我删除了这些行
  • 你说得对,鲍里斯,我对 KVO 的看法是错误的。坏习惯难改。我现在要移除我的 cmets。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2023-03-03
  • 2020-04-20
  • 2013-07-07
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多