ios - 什么时候在 Swift 中使用@objc?

标签 ios objective-c swift selector private

在 Swift 中,我看到了一些方法,例如:

@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)

我在想,什么时候使用@objc?我读了一些文档,但他们说当你希望它在 Objective-C 中可调用时,你应该添加 @objc 标志

然而,这是Swift中的私有(private)函数,@obj是做什么的呢?

最佳答案

另一个迟到的答案,但是关于这个问题的现有答案都没有真正回答 OP 的问题,即:为什么你需要使用 @objcprivate 上类成员,如果 @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/

相关文章:

ios - 仅通过 hockeyapp 构建发生的崩溃?

ios - 名为 runner 的 SKSpriteNode 以相反的方式移动

swift - 在获取 JSON 值中发布 SWIFT Alamofire

ios - 为所有设备设置常量

ios - 如何使用自动化生成随机 iOS 用户事件?

ios - 从 JSON 响应中提取一个属性

objective-c - 与 ARC 的奇怪双重发布?

iphone - 多个服务器使用相同的 SSL 证书连接到 APNS

iphone - 减速移动 UIView

ios - 如何在 Swift 中从不同的 ViewController 重新加载 TableView 中的数据