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

Posted

技术标签:

【中文标题】如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?【英文标题】:How to avoid using @objc with a refresh control in iOS 11 with Swift 4? 【发布时间】:2017-10-08 02:06:04 【问题描述】:

我将我的项目从 Swift 3 升级到 Swift 4,并在迁移过程中在我的代码中插入了一堆“@objc”注释。我希望摆脱它们以避免生成任何 Objective-C 入口点。我不知道如何摆脱的其中之一是使用刷新控件。这是有问题的代码:

let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(MyController.handleRefresh(refreshControl:)), for: .valueChanged)
self.table.refreshControl = refreshControl;

问题似乎是#selector 的使用。如何在没有选择器的情况下实现刷新控件?

【问题讨论】:

你可以尝试使用类型别名吗? 避免生成任何 Objective-C 入口点为什么这对你很重要? @Caleb 我的主要原因是我想编写干净、漂亮的 Swift-4 代码,其中没有 Objective-C,而 objc 的东西很丑。我的第二个原因显然是“生成所有这些 Objective-C 入口点的成本很高”(evgenii.com/blog/disabling-swift3-objc-inference-in-xcode9)。 这是一个很好的问题 Gadzair。我自己也在想同样的事情。显然,Swift 4 并不打算让我们使用 @objc 注释。它旨在向后兼容早期项目。我想 @objc 注释最终可能会被弃用。你有没有想过如何在没有选择器的情况下实现刷新控件? (也许这甚至还不是 Apple 解决的问题,所以也许我们现在必须使用注释;不确定。) 是的,我对其进行了更多研究,基本上看来,Apple 尚未更新其所有 API。我希望在 WWDC 2018 上看到很多改进。 【参考方案1】:

我想摆脱他们

你不能,你需要停止想要。 #selector 一个Objective-C特性,因此你必须明确地向Objective-C公开动作方法。 (之前你已经含蓄地暴露了它;现在你必须说出你的意思。)

【讨论】:

【参考方案2】:

您可以使用@IBAction 代替@objc 两者都使用反射,但 Swift4 对 @IBAction 没有问题

【讨论】:

以上是关于如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?的主要内容,如果未能解决你的问题,请参考以下文章