加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Swift 3:为什么在发送者的行动参数之前添加符号_?

发布时间:2020-12-14 18:07:35 所属栏目:百科 来源:网络整理
导读:我的 Xcode最近已经使用 Swift 3更新为Xcode 8.我注意到,当以这种方式生成对ViewController函数的附加操作时: @IBAction func methodName(_ sender: UIButton) {} 我不明白在那里有什么目的.任何人都可以解释它为什么存在吗?在之前的Swift 2.2中它并不存在
我的 Xcode最近已经使用 Swift 3更新为Xcode 8.我注意到,当以这种方式生成对ViewController函数的附加操作时:

@IBAction func methodName(_ sender: UIButton) {

}

我不明白在那里有什么目的.任何人都可以解释它为什么存在吗?在之前的Swift 2.2中它并不存在.

另一个问题是,我通过观看教程完成的先前项目已迁移到Swift 3,并且有一种方法看起来像这样:

func toggleButtons(toggle: Bool) {
    yesButton.isUserInteractionEnabled = toggle
    noButton.isUserInteractionEnabled = toggle
}

我这样调用这个方法:toggleButtons(false)仍然没有传递参数名称.现在,迁移器已经如下所示进行了更改,但是稍后在代码中调用方法时没有任何更改.

func toggleButtons(_ toggle: Bool) {
    yesButton.isUserInteractionEnabled = toggle
    noButton.isUserInteractionEnabled = toggle
}

这是与前一案件不同的情况吗?

解决方法

其他答案(其中一个已被删除)涵盖了_的含义:它在您调用方法时会删除关键字.

但是,您的问题具体是“将操作附加到ViewController”.

具有@IBAction属性的方法可以连接到storyboard(或xib)中的控件.这意味着该方法的名称将作为字符串存储在故事板中,并将使用Objective-C消息发送系统进行调用.因此,确切的名称以及名称如何转换为Objective-C在这里非常重要.

如果声明方法func methodName(sender:UIButton),那么它的Objective-C名称是methodNameWithSender:.

如果声明方法func methodName(_ sender:UIButton),则其Objective-C名称为methodName:.

iOS和macOS都有称为“响应者链”的东西,它允许系统搜索可以处理动作的对象(“响应者”).您可以将故事板中的控件连接到First Responder(位于文档大纲的顶部),以使系统执行此操作.最常见的是,您使用macOS中的菜单项执行此操作,但还有其他用途.

无论如何,有一些标准的动作,如cut:,copy:和paste:.例如,您可以将“剪切”菜单项的操作设置为“将剪切:发送到第一响应者”.如果你想在你的视图控制器中实现cut:方法,那么关键是它的名字(当翻译成Objective-C时)被精确剪切:而不是cutWithSender:.如果它被命名为cut:,系统将在搜索响应者链时找到它,但如果它被命名为cutWithSender:,系统将找不到它,你会想知道为什么你的菜单项不起作用.

Xcode知道这一点,所以它总是创建@IBAction func动作形式的动作方法(_ sender:UIButton),省略参数中的关键字,以防你实现需要通过搜索响应者链找到的动作.

在Swift 3中,方法的每个参数默认都有一个关键字,包括第一个参数.回到Swift 2,第一个参数默认没有关键字,所以第一个参数的_在Swift 2中是多余的(并且会生成编译器警告).这就是为什么Xcode 8(Swift 3)输入_但Xcode 7(Swift 2.2)没有.

这也是你的toggleButtons示例在Xcode 7中工作的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读