gpt4 book ai didi

swift - Swift 中 Closure block 语法背后的逻辑推理是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:44 28 4
gpt4 key购买 nike

根据 Apple documentation ,闭包的语法如下

{ (parameters) -> return type in
statements
}

将参数和返回类型放在 curlies 中而不是使用更熟悉的函数类型语法(例如

)背后的逻辑推理是什么
 func name(parameters) -> return_type { 
statements
}

最佳答案

闭包语法是在一些常见情况下促进简洁的方式。考虑命名函数语法,如果它用于闭包(显然删除 name 因为闭包是匿名函数文字)。

而不是当前的方法(最冗长的形式):

let f: (Type) -> ReturnType = { (parameter: Type) -> ReturnType in 
return process(parameter)
}

它会是:

let f: (Type) -> ReturnType = func (parameter: Type) -> ReturnType { 
return process(parameter)
}

这有很多问题。首先,闭包通常可以推断出它们的参数和返回类型,因此语法为:

let f: (Type) -> ReturnType = func (parameter) { 
return process(parameter)
}

这开始变得有点困惑了。这是返回 Void 的函数,还是返回 ReturnType 的函数?在标准的命名函数语法中,省略返回类型意味着 Void,但在这里它并不那么明显。编译器是肯定的;不会有歧义,但它已经以微妙的方式偏离了命名函数语法。

(让所有函数都包含它们的返回类型会更加一致,但我认为许多 Swift 开发人员会因为不得不如此频繁地键入 -> Void 而感到不安。或者他们可以所有函数都有隐式返回类型,就像在 Scala 中一样,但他们觉得这会损害可读性。)

现在考虑隐式参数和假设返回的情况:

let f: (Type) -> ReturnType = func { process($0)}

这是一个非常非常常见的案例。例如考虑它会对 map 做什么:

xs.map(func { process($0) })

我认为这里额外的 func 只是噪音。 xs.map{ process($0) } 是更好的 IMO。

一个更深层次的问题是为什么函数不遵循闭包语法。如果没有像这样的“方法”功能属性,实际上会有很多好处:

struct Foo {
let dothing = { (x: Int) -> Int in x * 2 }
}

而不是

struct Foo {
func dothing(x: Int) -> Int { return x * 2 }
}

命名函数如此特殊的事实实际上是 Swift 的奇怪之处,它带来了很多令人头疼的问题(比如你不能使用函数属性来符合协议(protocol),只能使用命名函数)。

但提供 func 语法对 C、Java 和 JavaScript 开发人员来说感觉更自然,这就是我怀疑它存在的原因。对于 ML 和 Scala 开发人员来说,这很奇怪。但它对于闭包的效果几乎没有那么好。

关于swift - Swift 中 Closure block 语法背后的逻辑推理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347275/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com