首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中创建与Objective-C等效的Getter和Setter

在Swift中创建与Objective-C等效的Getter和Setter
EN

Stack Overflow用户
提问于 2014-06-11 05:32:10
回答 3查看 10.3K关注 0票数 14

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

代码语言:javascript
运行
复制
@property (nonatomic, assign, getter = isOpen) BOOL open;

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

此外,您如何随后重写getter和setter的实现?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-11 05:50:54

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

首先,nonatomicassign在swift中是不相关的。这给我们留下了

代码语言:javascript
运行
复制
@property (getter = isOpen) BOOL open;

因为swift中的属性只是实例变量,所以swift的转换如下所示。

代码语言:javascript
运行
复制
var open:Bool

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

代码语言:javascript
运行
复制
var open:Bool {
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}

一种相当粗糙的变通方法是创建另一个名为isOpen的函数,该函数将充当getter。

代码语言:javascript
运行
复制
func isOpen() -> Bool { return self.open }

总而言之,您所要求的只有很小的可能性,但希望在以后的swift版本中能够成为现实。

票数 18
EN

Stack Overflow用户

发布于 2016-01-26 11:44:46

代码语言:javascript
运行
复制
var open: Bool {
    @objc(isOpen)
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}

导致生成此标头:

代码语言:javascript
运行
复制
SWIFT_CLASS("_TtC11SwiftToObjC9TestClass")
@interface TestClass : NSObject
@property (nonatomic, getter=isOpen) BOOL open;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
票数 19
EN

Stack Overflow用户

发布于 2019-05-17 16:07:22

作为补充,对于设置器,您需要重复@objc指令:

代码语言:javascript
运行
复制
@objc( setOpen:) set { self.open = newValue }

别忘了半柱。

一件特别的事情是,在这样做的时候,self.open将调用setter/getter本身并产生一个无限循环。在Obj-C中,您可以使用self->open修复它。如果是swift,该怎么做呢?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24151197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档