Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中创建Objective-C等效的Getter和Setter_Objective C_Swift - Fatal编程技术网

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

在Swift中创建Objective-C等效的Getter和Setter,objective-c,swift,Objective C,Swift,Swift中以下Objective-C代码的等效项是什么 @property (nonatomic, assign, getter = isOpen) BOOL open; 具体来说,如何在Swift中声明一个变量来合成具有自定义名称的getter 此外,您随后如何覆盖getter和setter的实现呢?您的假设很接近,但是有一些事情可以改变。我将尽力帮助您尽可能接近Objective-C版本 首先,非原子和赋值在swift中是不相关的。这就给我们留下了 @property (getter =

Swift中以下Objective-C代码的等效项是什么

@property (nonatomic, assign, getter = isOpen) BOOL open;
具体来说,如何在Swift中声明一个变量来合成具有自定义名称的getter


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

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

首先,
非原子
赋值
在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版本中能够成为现实

var open: Bool {
    @objc(isOpen)
    get {
        // custom getter
    }
    set {
        // custom setter
    }
}
导致生成此标题:

SWIFT\u类(“TtC11SwiftToObjC9TestClass”)
@接口TestClass:NSObject
@属性(非原子,getter=isOpen)BOOL open;
-(非空instancetype)init OBJC_指定的_初始值设定项;
@结束

作为remarq,对于setter,您需要重复
@objc
指令:

@objc( setOpen:) set { self.open = newValue }
不要放弃半柱

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

我想你真的需要阅读苹果关于swift的书。它是免费的@科林:我会鼓励亲密的选民阅读这里的讨论。必要时,使用@objc()属性为属性和方法提供Objective-C名称。例如,您可以将名为enabled的属性标记为Objective-C中名为isEnabled的getter,如下所示@对于这些基本问题,ColinE StackOverflow是一个更好的参考,它倾向于提供更好的搜索结果,而不是通过老式的死树式指南或手册进行挖掘。一旦Swift获得访问控制机制(它们已经存在),这将更加普遍。谢谢。现在编写一个命名的getter是有意义的:
var-isOpen:Bool{get{}
如果您还想要一个setter,请使用
var-isOpen:Bool{set{}get{}
-每当设置一个值时,它都会作为
新值传递给setter
-还要注意,属性必须在两个实例中声明一个类型。我认为这是这个基本问题的一个很好的答案,并鼓励您投票重新打开这个问题。我已经澄清了这个问题,因此它与答案更匹配。通过将
@objc()
行移动到
set
行上方,可以为setter实现相同的行为,这是毫无价值的。因为它是一个setter,所以需要一个参数,所以在setter名称后面还需要一个
。不适合我:(,当我试图从swift类unsigned int propertyCount=0;objc_property_t*properties=class\u copyPropertyList([对象类],&propertyCount)获取getter时,getter列表中不会出现);NSDictionary*info=[self-GetObjectInfo WithProperties:properties propertyCount:propertyCount];NSMutableArray*propertyGetters=[info-objectForKey:@“propertyGetters”];