无法将Swift 2.2货币转换为未来的Swift格式

无法将Swift 2.2货币转换为未来的Swift格式,swift,currying,Swift,Currying,我有以下curried函数,我收到一个XCode警告,curried函数语法将在未来版本的Swift中删除;使用单个参数列表,但建议的修复方法不起作用(它只是将参数合并到一个函数调用中)。我试图转换成新的格式,但我不明白它是如何工作的。下面的beginFetchWithCompletionHandler函数期望handleDownload具有的参数签名(数据:NSData?,错误:NSError?) 我还想传入一个整数,如下所示: fetcher.beginFetchWithCompletion

我有以下curried函数,我收到一个XCode警告,curried函数语法将在未来版本的Swift中删除;使用单个参数列表,但建议的修复方法不起作用(它只是将参数合并到一个函数调用中)。我试图转换成新的格式,但我不明白它是如何工作的。下面的
beginFetchWithCompletionHandler
函数期望
handleDownload
具有
的参数签名(数据:NSData?,错误:NSError?

我还想传入一个整数,如下所示:

fetcher.beginFetchWithCompletionHandler(handleDownload(0))
以下curry函数工作正常(但给出警告):

以下是我尝试过的,但我得到了错误,“表达式解析为未使用的函数”:


内花括号错误,应为:

func handleDownload2(iCount:Int) -> (NSData?, NSError?) -> Void {
    return { (data: NSData?, error: NSError?) -> Void in
        // received image
        print(iCount)
        print(data!.length)
    }
}

已被接受的Swift演进提案指出:

我们在
func
声明中取消了对多个参数模式的支持,减少了
func签名的语法,只允许一个
argument
子句。出于迁移目的,可以将使用currying声明语法的现有代码转换为显式返回闭包:


因此,Martin R为解决代码问题给出的答案是正确的:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    return { (data: NSData?, error: NSError?) -> Void in
        // received image
        print(iCount)
        print(data!.length)
    }
}

但是,请注意,您可以更简洁:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    return { (data, error) in
        // received image
        print(iCount)
        print(data!.length)
    }
}
在这里,
data
error
的类型由
handleDownload2
函数的返回类型隐式给出:
(NSData?,NSError?)->Void


尽管我不推荐它用于可读性问题,但您的代码可以通过使用以下命令更加简洁:


此外,当我使用闭包时,我有时会尝试显式,因为它可以帮助我快速为它们设置正确的返回类型:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    let innerBlock: (NSData?, NSError?) -> Void = { (data, error) in
        // received image
        print(iCount)
        print(data!.length)
    }
    return innerBlock
}

工作完美。谢谢
  // Before:
  func curried(x: Int)(y: String) -> Float {
    return Float(x) + Float(y)!
  }

  // After:
  func curried(x: Int) -> (String) -> Float {
    return {(y: String) -> Float in
      return Float(x) + Float(y)!
    }
  }
func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    return { (data: NSData?, error: NSError?) -> Void in
        // received image
        print(iCount)
        print(data!.length)
    }
}
func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    return { (data, error) in
        // received image
        print(iCount)
        print(data!.length)
    }
}
func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    return {
        // received image
        print(iCount)
        print($0!.length)
    }
}
func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void {
    let innerBlock: (NSData?, NSError?) -> Void = { (data, error) in
        // received image
        print(iCount)
        print(data!.length)
    }
    return innerBlock
}