热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

在Swift中通过Selector调用函数时,为什么不遵守默认函数参数?

如何解决《在Swift中通过Selector调用函数时,为什么不遵守默认函数参数?》经验,为你挑选了1个好方法。

通过Selector调用的方法不遵守默认参数值。

如果我连接了一个按钮以通过选择器调用函数:

func setupButton() {
    self.button.addTarget(self, action: #selector(printValue), for: .touchUpInside)
}

@objc func printValue(value:Int = 7)
{
    if value == 7 {
       print("received default")
    } else {
       print("default unused")
    }
}

通过代码调用此方法时,将打印“ received default”,但是当我按下按钮并通过选择器调用该方法时,将显示“默认未使用”,因为未将7设置为该值。


为什么会这样呢?



1> Macmade..:

调用函数时,默认参数由Swift编译器插入
因此,这是一个编译时的事情。

通过选择器手动调用该函数时,使用的是Objective-C运行时,它不了解默认参数。
这是运行时的事情

此外,Objective-C中不存在默认参数。

您可以将Swift默认参数视为编译时的便利。
但是一旦您运行了代码,它们基本上就消失了。

编辑

如果您正在寻找解决方法,我建议您使用两个不同的功能,而不使用默认参数:

@objc func printValue()
{
    printValue(value: 7)
}

@objc func printValue(value:Int)
{}

这样,您可以通过Objective-C运行时在不带参数的情况下调用它。请注意,使用时#selector,您需要进行强制转换以消除歧义:

self.button?.addTarget(self, action: #selector((printValue as () -> Void)), for: .touchUpInside)


推荐阅读
author-avatar
克阳光沫沫的幸福
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有