在Swift 4中@objc dynamic var是什么意思

在Swift 4中@objc dynamic var是什么意思,dynamic,swift4,Dynamic,Swift4,您能简要解释一下使用Xcode 9.x的Swift 4中的@objc和dynamic是什么意思吗 通过尝试和错误以及stackoverflow中的以下文章,我最终实现了这段代码的正常工作。但我想知道一点关于这些神奇的关键词 class SampleViewController:NSViewController{ @objc类参数:NSObject{ @objc动态变量value1:Double=0//绑定到带有NumberFormatter的NSTextfield的值 @objc动态var v

您能简要解释一下使用Xcode 9.x的Swift 4中的
@objc
dynamic
是什么意思吗

通过尝试和错误以及stackoverflow中的以下文章,我最终实现了这段代码的正常工作。但我想知道一点关于这些神奇的关键词

class SampleViewController:NSViewController{
@objc类参数:NSObject{
@objc动态变量value1:Double=0//绑定到带有NumberFormatter的NSTextfield的值
@objc动态var value2:Double=0//作为模型键路径的“parameters.value1”
}
@objc动态变量参数=参数()
@objc动态var value3:Double{//,其方式与模型键路径的“value3”类似
得到{
返回parameters.value1+parameters.value2
}
}
重写类func KEYPATHSFORVALUESFECTINGVALUE(forKey:String)->Set{
开关钥匙{
案例“价值3”:
返回集([“parameters.value1”、“parameters.value2”])
违约:
返回super.keypathsforvaluesafectingvalue(forKey:key)
}
}
}

在享受Xcode及其反汇编程序的乐趣时,我发现了一些。感谢迈克·亨德森的评论

首先,添加一个
@objc
修饰符似乎让编译器将其对应的符号名写入可执行文件和/或库文件的
\uuuobjc
段中,然后Objective-C运行时系统将使用该段。
otool-o filename
命令向我们显示
\uuu OBJC
段的内容

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

现在,在我的理解中,
dynamic dispatch
这个行话意味着使用
objc_msgSend()
,而
static dispatch
没有使用它。在后一种情况下,访问变量和调用函数都将在没有Objy-C运行时系统的干预下完成,这是类似的,但不是完全相同的方式,C++ + ABI。p> 显然,静态的比动态的快。但是静态的一个不能实现Objective-C的神奇好处。使用编程语言Swift,我们有机会利用这两个方面,根据情况选择静态或动态调度,分别省略或添加这些神奇的关键字

谢谢

进一步阅读:


@objc表示您希望您的Swift代码(类、方法、属性等)在Objective-C中可见

动态表示您希望使用Objective-C动态分派


@objc
将变量公开给objc运行时
dynamic
告诉运行时使用动态调度而不是默认的静态调度<代码>动态也意味着
@objc
因此
@objc动态
是冗余的。您主要在KVO和Cocoa绑定中使用它们。请参阅本文:动态分派对于方法(func)来说是有意义的,但对于var来说这意味着什么?你不会“打电话/派车”吧?
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)
    }
  }

}