以下Objective-C代码在Swift中的等价物是什么?
@property (nonatomic, assign, getter = isOpen) BOOL open;具体地说,如何在Swift中声明一个变量来合成带有自定义名称的getter?
此外,您如何随后重写getter和setter的实现?
发布于 2014-06-11 05:50:54
你的假设很接近,但有一些事情是可以改变的。我将尝试帮助您尽可能接近Objective-C版本。
首先,nonatomic和assign在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的函数,该函数将充当getter。
func isOpen() -> Bool { return self.open }总而言之,您所要求的只有很小的可能性,但希望在以后的swift版本中能够成为现实。
发布于 2016-01-26 11:44:46
var open: Bool {
@objc(isOpen)
get {
// custom getter
}
set {
// custom setter
}
}导致生成此标头:
SWIFT_CLASS("_TtC11SwiftToObjC9TestClass")
@interface TestClass : NSObject
@property (nonatomic, getter=isOpen) BOOL open;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end发布于 2019-05-17 16:07:22
作为补充,对于设置器,您需要重复@objc指令:
@objc( setOpen:) set { self.open = newValue }别忘了半柱。
一件特别的事情是,在这样做的时候,self.open将调用setter/getter本身并产生一个无限循环。在Obj-C中,您可以使用self->open修复它。如果是swift,该怎么做呢?
https://stackoverflow.com/questions/24151197
复制相似问题