【问题标题】:Swift 4: Cannot assign value of type '(_) -> Void' to type '(() -> ())?'Swift 4:无法将类型“(_)-> Void”的值分配给类型“(()->())?”
【发布时间】:2017-07-17 18:10:11
【问题描述】:

XCode 9,测试版 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(); ... }吗?
  • 已编辑。有效,想提供答案吗?
  • 我添加了答案

标签: swift closures


【解决方案1】:

我遇到了类似的问题,我是这样解决的:

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

希望对你有帮助。

【讨论】:

  • 接受的答案有什么不同?不一样吗?
  • 区别在于 { 后面的“_in”。在我的情况下,答案没有编译
  • 没错,我的解决方案是针对 Swift 4,没有“_ in”我认为它应该在 Swift 3 中工作
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我对这些函数的 API 一无所知(你从未告诉我们它们是什么),但错误告诉你的是:

    无法分配类型的值

    指的是参数传递,是一种“赋值”

    '(_) -> 无效'

    这是您为参数提供的参数的类型。它有一些未知类型的参数(_),并返回(->Void

    输入 '(() -> ())?'

    这是此参数预期的参数类型。它没有参数(()),它返回(->Void()),它是可选的((...)?

    所以问题是您将带有参数的闭包作为参数传递给期望无参数闭包的参数。

    【讨论】:

      【解决方案4】:

      在我看来,您的编辑有您的答案:闭包类型是 () -> (),但您为闭包提供了一个参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多