【问题标题】:Creating an Objective-C equivalent Getter and Setter in Swift在 Swift 中创建一个 Objective-C 等价的 Getter 和 Setter
【发布时间】:2014-06-10 21:32:09
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为你真的需要阅读苹果关于 Swift 的书。它是免费的!
  • @ColinE:回答 swift-language 中大约 50% 的问题
  • 我会鼓励亲近的选民阅读这里的讨论。 meta.stackexchange.com/questions/86043/…
  • “在必要时使用 @objc() 属性为属性和方法提供 Objective-C 名称。例如,您可以像这样在 Objective-C 中将一个名为 enabled 的属性标记为具有一个名为 isEnabled 的 getter”
  • 对于这些基本问题,@ColinE StackOverflow 是一个更好的参考,并且倾向于提供更好的搜索结果,而不是通过老式的死树样式指南或手册进行挖掘。

标签: objective-c swift


【解决方案1】:

你的假设很接近,但有一些事情可以改变。我会尽力帮助你尽可能接近 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,它将充当一个 getter。

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

总之,你所问的只是稍微有可能,但希望在以后的 swift 版本中可以成为现实。

【讨论】:

  • 一旦 Swift 获得访问控制机制(它们一直是promised by the Swift team),这将更加普遍。
  • 谢谢。现在说得通了
  • 一个命名的getter被写成:var isOpen:Bool { get {} },如果你还想有一个setter,请使用var isOpen:Bool { set {} get {} } - 每当设置一个值时,它都会作为newValue传递给setter - 另请注意该属性必须具有在两个实例中声明的类型
  • 我认为这是这个基本问题的一个很好的答案,并鼓励您投票重新提出这个问题。我已经澄清了问题,因此它与答案更好地匹配。
【解决方案2】:
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

【讨论】:

  • 通过将@objc(<custom name>) 行移到set 行的上方,可以为setter 实现相同的行为,这是毫无价值的。因为它是一个 setter,它需要一个参数,所以你还需要在 setter 名称后面加上一个:
  • 不适合我 :( ,当我尝试从 swift class unsigned int propertyCount = 0; objc_property_t * properties = class_copyPropertyList([object class], &propertyCount); 获取 getter 时,不会出现在 getter 列表中NSDictionary * info = [self getObjectInfoWithProperties:properties propertyCount:propertyCount]; NSMutableArray * propertyGetters = [info objectForKey:@"propertyGetters"];
【解决方案3】:

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

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

别忘了半栏。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2023-03-12
    • 2012-05-12
    相关资源
    最近更新 更多