@objc dynamic var在Swift 4中意味着什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@objc dynamic var在Swift 4中意味着什么相关的知识,希望对你有一定的参考价值。

你能用Xcode 9.x简要解释一下@objcdynamic在Swift 4中的含义吗?

有了尝试和错误以及stackoverflow中的以下文章,我最终实现了这个片段。但我想了解一下这些神奇的关键词。

enter image description here

class SampleViewController: NSViewController {

  @objc class Parameters : NSObject {
    @objc dynamic var value1: Double = 0  // bound to Value of a NSTextfield with NumberFormatter
    @objc dynamic var value2: Double = 0  // as "parameters.value1" for the Model Key Path
  }

  @objc dynamic var parameters = Parameters()

  @objc dynamic var value3: Double {  // in the similar way as "value3" for the Model Key Path
    get {
      return parameters.value1 + parameters.value2
    }
  }

  override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
    switch key {
    case "value3" :
      return Set(["parameters.value1", "parameters.value2"])
    default:
      return super.keyPathsForValuesAffectingValue(forKey: key)
    }
  }

}
答案

@objc意味着您希望从Objective-C中看到您的Swift代码(类,方法,属性等)。

动态意味着您要使用Objective-C动态分派。

Swift 3 - dynamic vs @objc

另一答案

和Xcode及其反汇编程序一起玩,我找到了一些。感谢Mike Henderson的评论。

首先,添加@objc修饰符似乎让编译器在可执行文件和/或库文件的__OBJC段中写入其相应的符号名称,然后由Objective-C运行时系统使用。 otool -o filename命令向我们展示了__OBJC段的内容。

其次,添加一个dynamic修饰符似乎让编译器插入额外的汇编代码来与Objective-C运行时系统进行交互。附加代码意识到访问动态属性将通过objc_msgSend()及其相关函数完成。同样,调用dynamic方法也将通过objc_msgSend()完成。

现在,根据我的理解,行话dynamic dispatch暗示使用objc_msgSend(),而static dispatch不使用它。在后一种情况下,访问变量和调用函数都将在没有Objective-C运行时系统干预的情况下完成,这与C ++ ABI类似但不完全相同。

显然,静态比动态更快。但是,静态的无法实现Objective-C的神奇功效。使用Swift编程语言,我们有机会根据情况选择静态或动态调度,分别省略或添加那些神奇的关键字。

谢谢!

进一步阅读:

以上是关于@objc dynamic var在Swift 4中意味着什么的主要内容,如果未能解决你的问题,请参考以下文章

@objc 动态变量在 Swift 4 中是啥意思

Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic

Objc 代码找不到 swift 中定义的 Bool 变量

如何从lldb中的objc访问swift方便变量?

Swift 4 添加手势:覆盖 vs @objc

如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?