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