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

时间:2014-06-10 21:32:10

标签: objective-c swift

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

@property (nonatomic, assign, getter = isOpen) BOOL open;

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

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

3 个答案:

答案 0 :(得分:17)

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

首先,nonatomicassign与swift无关。这让我们

@property (getter = isOpen) BOOL open;

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

var open:Bool

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

var open:Bool {
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}

一个相当粗略的工作是使另一个函数字面上称为isOpen,它将充当一个吸气剂。

func isOpen() -> Bool { return self.open }

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

答案 1 :(得分:17)

<android.support.v7.widget.RecyclerView
    android:id="@+id/drawer_recyclerview"
    android:layout_width="match_parent"
    android:layout_alignParentBottom="true"
    android:choiceMode="singleChoice"
    android:dividerHeight="0dp"
    android:background="#ffff"
    android:layout_height="400dp"
    android:clipToPadding="false"
    android:padding="8dp">
</android.support.v7.widget.RecyclerView>

导致生成此标头:

var open: Bool {
    @objc(isOpen)
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}

答案 2 :(得分:-1)

作为建议,对于二传手,您需要重复@objc指令:

@objc( setOpen:) set { self.open = newValue }

不要遗忘半列。

一个特别的事情是,self.open会调用设置程序/获取程序本身并产生无限循环。 在Obj-C中,您可以使用self->open对其进行修复。快点怎么办?