Swift - 警报操作处理程序错误
Swift - alert action handler error
我遇到了一些奇怪的事情:尝试使用 FLurry Analytics SDK 跟踪是否在 UIAlertAction 处理程序中取消了共享操作。代码基本上应该是这样的:
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
(action:UIAlertAction!) -> Void in
Flurry.logEvent("Share Cancelled")
}
)
但编译器显示错误 "Extra argument "title"in call..." 并以红色突出显示 "Cancel"。
虽然如果我添加任何变量声明或像 println() 这样的简单函数,但没有错误!即此代码已正确编译并被认为可以工作:
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
(action:UIAlertAction!) -> Void in
let somevar = 0
Flurry.logEvent("Share Cancelled")
}
)
有人遇到过这样的事情吗?可能是 Swift 或 Flurry 错误?
为了解决问题,根据我之前的评论,Swift 将尝试使用单个语句从闭包中推断出 return 类型。如果您尝试使用具有 return 值的单个语句定义闭包,那么 Swift 将假定它是闭包的 return 值。
既然您注意到 logEvent return 是一个值,您将需要明确地 return 什么都没有,以创建适当的闭包。
就其价值而言,这似乎已在 6.3 中更改/修复,因为现在执行以下代码:
func foo() -> Int {
return 1
}
func bar(() -> ()) {
println("Hello from bar")
}
bar({ foo() })
一般来说,调试此类不明确错误的方法是将语句分成多行,在每个阶段明确定义预期类型,并观察它在哪里中断。
我遇到了一些奇怪的事情:尝试使用 FLurry Analytics SDK 跟踪是否在 UIAlertAction 处理程序中取消了共享操作。代码基本上应该是这样的:
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
(action:UIAlertAction!) -> Void in
Flurry.logEvent("Share Cancelled")
}
)
但编译器显示错误 "Extra argument "title"in call..." 并以红色突出显示 "Cancel"。 虽然如果我添加任何变量声明或像 println() 这样的简单函数,但没有错误!即此代码已正确编译并被认为可以工作:
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
(action:UIAlertAction!) -> Void in
let somevar = 0
Flurry.logEvent("Share Cancelled")
}
)
有人遇到过这样的事情吗?可能是 Swift 或 Flurry 错误?
为了解决问题,根据我之前的评论,Swift 将尝试使用单个语句从闭包中推断出 return 类型。如果您尝试使用具有 return 值的单个语句定义闭包,那么 Swift 将假定它是闭包的 return 值。
既然您注意到 logEvent return 是一个值,您将需要明确地 return 什么都没有,以创建适当的闭包。
就其价值而言,这似乎已在 6.3 中更改/修复,因为现在执行以下代码:
func foo() -> Int {
return 1
}
func bar(() -> ()) {
println("Hello from bar")
}
bar({ foo() })
一般来说,调试此类不明确错误的方法是将语句分成多行,在每个阶段明确定义预期类型,并观察它在哪里中断。