如何避免在带有 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ImageMagick 库与 Swift 4/iOS 11 一起使用?

如何实现UIButton的小型Dropdown,例如在Swift 4和iOS 11中选择货币?

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度

Xcode 11.4 Objective-C 语言的快速帮助,而不是 swift 语言,用于带有 Cocoapods 的 firebase API(iOS 13.4 应用程序)

如何从带有 ios Swift 3 的肥皂 Web 服务方法中获取 json 数组字符串?

swift 带有Swift 4 ios应用程序填充的圆形视图