Dan*_*son 3 objective-c-runtime swift
通过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")
}
}
Run Code Online (Sandbox Code Playgroud)
通过代码调用此方法时,将打印“ received default”,但是当我按下按钮并通过选择器调用该方法时,将显示“默认未使用”,因为未将7设置为该值。
为什么会这样呢?
调用函数时,默认参数由Swift编译器插入。
因此,这是一个编译时的事情。
通过选择器手动调用该函数时,使用的是Objective-C运行时,它不了解默认参数。
这是运行时的事情。
此外,Objective-C中不存在默认参数。
您可以将Swift默认参数视为编译时的便利。
但是一旦您运行了代码,它们基本上就消失了。
编辑
如果您正在寻找解决方法,我建议您使用两个不同的功能,而不使用默认参数:
@objc func printValue()
{
printValue(value: 7)
}
@objc func printValue(value:Int)
{}
Run Code Online (Sandbox Code Playgroud)
这样,您可以通过Objective-C运行时在不带参数的情况下调用它。请注意,使用时#selector,您需要进行强制转换以消除歧义:
self.button?.addTarget(self, action: #selector((printValue as () -> Void)), for: .touchUpInside)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |