如何在Objective-C中实现Swift的“didset”?

24

Swift(来自http://www.raywenderlich.com/出版的《iOS动画教程:第12章》):

let photoLayer = CALayer()

@IBInspectable
  var image: UIImage! {
    didSet {
      photoLayer.contents = image.CGImage
    }
}

我该如何在Objective-C中实现上述语法?我只知道像下面这样设置photoLayer和image的属性:

@property (strong, nonatomic) CALayer *photoLayer;
@property (strong, nonatomic) IBInspectable UIImage *image;

但我不知道如何使用 Objective-C 语法实现 didset { ... } 部分,请帮忙!


请查看以下链接:https://dev59.com/peo6XIcBkEYKwwoYIAgL - Bhavin Bhadani
请注意,如果图像为空,则此代码将在Swift中崩溃。 - Daij-Djan
在 Objective-C 中调用一个空对象是可行的,但在 Swift 中需要这样写:photoLayer.contents = image != nil ? image.CGImage : nil - Daij-Djan
看起来你正在寻找-setImage:方法。 - holex
2个回答

44

覆盖(setter)并自己实现(setter)。

- (void)setImage:(UIImage *)image {
    if (_image != image) {
        _image = image;
        photoLayer.contents = image.CGImage;
    }
}

3

由于Swift的静态特性,无法在运行时进行子类化,因此需要特殊的语言功能。

而在Objective-C中,则不需要这样做,因此没有相应的语言特性。您可以使用键值观察

但是,如果观察实例是已更改其属性的实例,则可以像@Daij-Djan提到的那样使用子类化来完成此操作。(基本上这就是您在Swift中要做的事情。)此外,在Objective-C中,您还可以观察不同类的不同实例的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接