【问题标题】:cannot convert value of type '(_) -> ()' to expected argument type 'Date'无法将类型“(_)->()”的值转换为预期的参数类型“日期”
【发布时间】:2016-11-07 22:23:14
【问题描述】:

如何使用花括号中传入的failureReason到方法launch,然后在方法中设置failureReason?

调用启动方法时出现此错误: 无法将类型 '(_) -> ()' 的值转换为预期的参数类型 'Date'

firstFalcon.launch() { failureReason in } 

func launch(date: Date = Date()) {
    self.launchDate = date.description
    var failureReason = ""
    if (fuelType == FuelType.water) {
        failureReason = "too much fuel in fuel tank"
    }
}

【问题讨论】:

  • XY-Problem。你不需要修复这个错误信息,你需要Error Handling
  • 不完全清楚为什么你首先要在这里使用闭包——对我来说,这看起来像是你可能希望 launch 函数到 throw 一个自定义LaunchFailure 错误。

标签: swift swift3


【解决方案1】:

您需要将它作为参数添加到您的launch 方法中。现在您的 launch 方法只需要一个日期...Date 类型,并且您已经给了它一个默认值,所以您不必传递它。

只添加一个字符串

我不确定我是否正确理解了您的问题,但您在 launch 方法中定义的 failureReason 似乎只是一个字符串

var failureReason = ""

如果是这种情况,那么您应该像这样在 launch 方法中添加另一个参数:

func launch(date: Date = Date(), failureReason: String)

然后你可以像这样调用它:

launch(failureReason: "boom")

添加回调函数

但是,如果您想传入一个可以在 launch 方法中使用的回调函数,可能带有失败原因,那么您可以这样做:

func launch(date: Date = Date(), callback: (String) -> Void)

在这里定义一个函数,它接受一个日期和一个callback 函数作为参数。然后该函数将String 作为输入参数。

在你的launch 函数中,你可以做任何你需要做的事情,一旦完成,你就可以用一个字符串调用callback 函数,所以可能是这样的:

func launch(date: Date = Date(), callback: (String)-> Void) {
    self.launchDate = date.description
    var failureReason = ""
    if (fuelType == FuelType.water) {
       failureReason = "too much fuel in fuel tank"
    }
    callback(failureReason)
}

然后你可以这样称呼它:

launch() { failureCode in
    print("failed with: \(failureCode)")
}

请注意,当您的闭包/回调是函数中的最后一个参数时,您可以在调用它时在参数列表“外部”调用它,就像我在上面所做的那样。这称为“尾随闭包”,您可以在 The Swift Programming Language

中了解它

希望我理解正确。

【讨论】:

  • 回调函数是我一直在寻找的。谢谢!
  • 不客气,希望我的回答对您有所帮助。如果您愿意,请随时将其标记为已接受 :)
猜你喜欢
  • 2016-07-27
  • 2016-07-02
  • 2016-03-21
  • 2020-03-01
  • 2016-08-01
  • 2017-02-07
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多