在 Swift 中,我看到了一些方法,例如:
@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)
我在想,什么时候使用@objc?我读了一些文档,但他们说当你希望它在 Objective-C 中可调用时,你应该添加 @objc 标志
然而,这是Swift中的私有(private)函数,@obj是做什么的呢?
最佳答案
另一个迟到的答案,但是关于这个问题的现有答案都没有真正回答 OP 的问题,即:为什么你需要使用 @objc
在 private
上类成员,如果 @objc
是否存在与 Objective-C 的交互,并且所讨论的成员是私有(private)的,这意味着即使您的项目中有 Objective-C 代码,它也不应该能够看到该成员?
原因在于,由于许多框架都是用 Objective-C 编写的,因此有时需要 Objective-C 特性才能与某些 API 进行交互。
例如,假设我想通过 DistributedNotificationCenter
注册一个通知:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
为此,我们需要能够获得 somethingHappened
的选择器方法。然而,选择器是一个 Objective-C 的概念,所以如果方法对 Objective-C 不可见,它就没有选择器。因此,即使该方法是私有(private)的并且不应该被任意外部代码调用,它也需要一个 @objc
。为了 DistributedNotification
用 Objective-C 编写的代码,以便能够通过其选择器调用它。
另一种常见情况 @objc
需要的是支持键值编码(KVC),特别是在 macOS 上,KVC 和 KVO 用于实现 Cocoa Bindings。与 Cocoa 中的许多其他系统一样,KVC 是在 Objective-C 中实现的,这具有要求将符合 KVC 的属性暴露给 Objective-C 运行时的效果。有时,将符合 KVC 的属性设置为私有(private)是有意义的。一个示例是当您拥有影响其他属性的属性时:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
在这种情况下,我们实际存储的属性是私有(private)的,但是我们向外部代码公开的依赖属性需要在更新私有(private)属性时发送通知。通过将私有(private)属性标记为 @objc
,我们可以通过设置 KVC 依赖项轻松地做到这一点——否则,我们必须编写代码来手动发送私有(private)属性的 willSet
中的通知。和 didSet
处理程序。此外,通知 KVC 系统的静态属性 dependentProperty
依赖于 originalProperty
需要暴露给 Objective-C,以便 KVC 系统找到它并调用它,但它与我们代码的客户端无关。
此外,macOS 应用程序中的 View Controller 使用 Cocoa 绑定(bind)作为实现细节更新其 View 中的控件可能会使某些私有(private)属性符合 KVC,以便将这些控件绑定(bind)到它们。
因此,如您所见,有时可能需要将方法或属性公开给 Objective-C 以便与框架交互,而不必对代码的客户可见。
关于ios - 什么时候在 Swift 中使用@objc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30795117/