Swift 4: 无法将类型为'(_) -> Void'的值分配给类型'(() -> ())?'

6

XCode 9,Beta 3。Swift 4。

    let button = JumpingButton(x: 0, y: 50, w: 150, h: 300) // JumpingButton: UIButton
    //Inside JumpingButton: // var clickAction: (() -> ())?


    button.clickAction = { (sender) -> Void in //Error line
        action()
        Sound.playSound(Sounds.Button)
    }

出现错误:无法将类型为'(_) -> Void'的值分配给类型'(() -> ())?'

button 是什么类型?它看起来需要一个无参闭包作为属性。你能试试 button.clickAction = { action(); ... } 吗? - Code Different
编辑过了,可以提供一个答案吗? - Esqarrouth
我添加了一个答案。 - Code Different
4个回答

8

因为 clickAction 需要一个无参的函数/闭包。只需将您的代码更改为:

button.clickAction = {
    action()
    Sound.playSound(Sounds.Button)
}

3
我不了解这些函数的API(你没有告诉我们它们是什么),但以下是错误提示的含义:
“Cannot assign value of type” 指的是参数传递,这是一种“赋值”。
“(_) -> Void” 是你给参数传入的类型。它有一个未知类型的参数“_”,返回(“->”)“Void”。
“(() -> ())?” 是这个参数期望的类型。它没有参数(“()”),返回(“->”)“Void”(“()”),并且是可选的(“(...)?”)。
因此,问题在于你正在将带有参数的闭包作为参数传递给期望无参数闭包的参数。

1
我有类似的问题,我这样解决了:

button.clickAction = { _ in
        action()
        Sound.playSound(Sounds.Button)
    }

希望它能帮到你。


采纳的答案有什么不同吗?难道不是一样的吗? - Eric Aya
区别在于 { 后面的 " _ in "。在我的情况下,那个答案无法编译。 - Pablo Blanco
我的解决方案适用于Swift 4,没有“_in”,我认为它应该在Swift 3中工作。 - Pablo Blanco

0

在我看来,你的编辑已经回答了你的问题:闭包类型是() -> (),但你正在为你的闭包提供一个参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接