在Swift中创建一个Objective-C等效的Getter和Setter

mik*_*ike 12 objective-c swift

什么是Swift中以下Objective-C代码的等价物?

@property (nonatomic, assign, getter = isOpen) BOOL open;
Run Code Online (Sandbox Code Playgroud)

具体来说,如何在Swift中声明一个变量来合成具有自定义名称的getter?

此外,您如何随后覆盖getter和setter的实现?

jon*_*ley 19

var open: Bool {
    @objc(isOpen)
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}
Run Code Online (Sandbox Code Playgroud)

导致生成此标头:

SWIFT_CLASS("_TtC11SwiftToObjC9TestClass")
@interface TestClass : NSObject
@property (nonatomic, getter=isOpen) BOOL open;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)


Bri*_*acy 18

你的假设很接近,但有些事情可以改变.我将尽力帮助您尽可能接近Objective-C版本.

首先,这nonatomicassign快速无关.这让我们失望了

@property (getter = isOpen) BOOL open;
Run Code Online (Sandbox Code Playgroud)

由于swift中的属性只是实例变量,因此快速转换如下.

var open:Bool
Run Code Online (Sandbox Code Playgroud)

虽然它具有与Objective-C版本相同的基本功能,但它缺少命名的getter(isOpen).不幸的是,没有直接翻译为swift(尚未).您可以使用自定义getter和setter.

var open:Bool {
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}
Run Code Online (Sandbox Code Playgroud)

一个相当粗略的工作是将字面上称为另一个函数isOpen作为一个吸气剂.

func isOpen() -> Bool { return self.open }
Run Code Online (Sandbox Code Playgroud)

总而言之,你所要求的只是略有可能,但希望在后期版本的swift中可以成为现实.

  • 写一个命名的getter:`var isOpen:Bool {get {}}`如果你想要一个setter,那么使用`var isOpen:Bool {set {} get {}}` - 每当设置一个值时,它就会被传递将setter作为`newValue` - 请注意该属性必须在两个实例中都声明了一个类型 (2认同)