gpt4 book ai didi

swift - Unrecognized Selector 在 Xcode/Swift 4 中是如何实现的?

转载 作者:行者123 更新时间:2023-11-28 10:48:08 25 4
gpt4 key购买 nike

代码完成在 #selector( 中填充方法的名称,然后在运行时继续崩溃,并出现无法识别选择器的错误 (IllegalArgumentException)。

将选择器语法重做为不再只是字符串的意义何在?

这里是选择器的创建:

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)

部分(此处引用)是 TableView 的标题部分(忘记提及,此代码在 Xcode 9 之前有效):

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

这是处理程序的方法签名:

@objc func addActivityToSpecificDay (sender :UIButton)

当然在同一个源文件中。但是请阅读以下问题:如果代码补全能够找到它,我到底是怎么会遇到运行时崩溃的?

最佳答案

您正在像这样添加目标:

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)

因为你的 #selector 没有用一个类来限定 addActivityToSpecificDay ,它显然与当前类中同名的某个方法匹配,而不是在任何类中部分是。

有两种选择:

  1. addActivityToSpecificDay 移动到 section 所在的任何类中(为了说明的目的,假设它是 SectionClass)并引用它在你的#selector中类:

    headerAddButton.addTarget(section, action: #selector(SectionClass.addActivityToSpecificDay(sender:)), for: .touchDown)
  2. 或者在当前类中保留addActivityToSpecificDay,但是将addTarget的目标更改为self:

    headerAddButton.addTarget(self, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)

你问:

What was the point of redoing the selector syntax as no longer just strings??

它验证了选择器的函数存在并且格式正确(这是一件非常好的事情),但它显然不能验证选择器的类恰好与其他一些参数(target在这个例子中)。编译器无法可靠地知道 addTarget 方法如何使用选择器,也无法知道两个参数之间存在某种特殊关系。这留给了开发者。 #selector 语法有帮助,但它不是 Elixir 。

关于swift - Unrecognized Selector 在 Xcode/Swift 4 中是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47563933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com