为什么在 Swift 中通过 Selector 调用时不考虑函数的默认参数?
Why aren't default parameters for functions respected when called via Selector in Swift?
通过选择器调用的方法不遵循默认参数值。
示例
如果我连接了一个按钮以通过选择器调用函数:
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" 调用此方法时打印出来,但是当我按下按钮并通过选择器 [=30= 调用方法时] 被打印出来,因为 7 没有被设置为值。
为什么会这样?
当您调用函数时,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)
通过选择器调用的方法不遵循默认参数值。
示例
如果我连接了一个按钮以通过选择器调用函数:
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" 调用此方法时打印出来,但是当我按下按钮并通过选择器 [=30= 调用方法时] 被打印出来,因为 7 没有被设置为值。
为什么会这样?
当您调用函数时,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)