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

Posted

技术标签:

【中文标题】@objc 动态变量在 Swift 4 中是啥意思【英文标题】:What does @objc dynamic var mean in Swift 4@objc 动态变量在 Swift 4 中是什么意思 【发布时间】:2018-02-01 09:52:17 【问题描述】:

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

通过尝试和错误以及 *** 中的后续文章,我最终实现了这个 sn-p 工作。但是我想知道一些关于那些神奇的关键字。

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 将变量公开给 ObjC 运行时。 dynamic 告诉运行时使用动态调度而不是默认的静态调度。 dynamic 也暗示 @objc 所以 @objc dynamic 是多余的。您主要在 KVO 和 Cocoa Binding 中使用它们。见这篇文章:krakendev.io/blog/hipster-swift#dynamic 【参考方案1】:

在玩 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,我们有机会通过根据情况选择静态或动态调度,分别省略或添加那些神奇的关键字来利用这两个方面。

谢谢!

进一步阅读:

Objective-C Runtime Using Swift with Cocoa and Objective-C (Swift 4.0.3)

【讨论】:

【参考方案2】:

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

dynamic 表示你想使用 Objective-C 动态调度。

Swift 3 - dynamic vs @objc

【讨论】:

动态调度对方法(func)是有意义的,但这对 var 意味着什么?你不会“调用/调度”变量对吗?

以上是关于@objc 动态变量在 Swift 4 中是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

声明函数时,“->”在swift中是啥意思?

=> 运算符在 Swift 中是啥意思?

这个块在 Swift - Alamofire 中是啥意思?

@@variable 在 Ruby 中是啥意思?

“var FOO = FOO || ”(将变量或空对象分配给该变量)在Javascript中是啥意思?

“var FOO = FOO || ”(将变量或空对象分配给该变量)在Javascript中是啥意思?