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() })

一般来说,调试此类不明确错误的方法是将语句分成多行,在每个阶段明确定义预期类型,并观察它在哪里中断。