【问题标题】:Unable to pass a parameter from a closure to a function in Swift无法将参数从闭包传递给 Swift 中的函数
【发布时间】:2020-06-26 01:57:59
【问题描述】:

我最近开始学习 Swift,遇到了一个关于闭包的问题。 我试图将驱动的参数传递给 func travel 并收到一条错误消息:无法将类型 '()' 的值转换为预期的参数类型 '() -> String'

谁能给点建议?欣赏!

import UIKit

let driving = { (place: String) in
    print ("I'm going to \(place).")
}


func travel(action: () -> String) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
}

travel(action: driving("London"))

【问题讨论】:

    标签: swift


    【解决方案1】:

    driving(String) -> Void 类型的闭包

    driving("London") 是一个函数调用表达式,调用该闭包,并将参数 "London" 传递给它。这个表达式的结果就是闭包的结果,也就是Void(也就是空元组())。

    () 参数值与参数不兼容,预计为() -> String

    【讨论】:

      【解决方案2】:

      driving 是一个闭包,但 driving("London") 是一个返回 () 的闭包调用。

      如果您需要闭包具有保存值“London”的变量,即如果您希望闭包捕获(“关闭”)它,您可以使用函数来实现:

      func makeAction(place: String) -> () -> String {
         { "I'm going to \(place)." }
      }
      
      let drivingToLondon = makeAction(place: "London")
      
      // drivingToLondon() will return "I'm going to London"
      
      travel(action: drivingToLondon)
      

      您可能还想更新travel 以打印闭包的返回值,因为它返回String

      func travel(action: () -> String) {
          print("I'm getting ready to go.")
          print(action())
          print("I arrived!")
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多