函数声明之间的swift有什么区别:
func function(a: String) {
print(a);
}
function("test");
和关闭分配:
let closure = {
(a: String) in
print(a);
}
closure("test");
这些之间有什么区别吗?
答案 0 :(得分:5)
有名或匿名
func function(a: String) {
print("\(a), name: \(__FUNCTION__)");
}
let closure = { (a: String) in
print("\(a), name: \(__FUNCTION__)");
}
捕获列表
仅在闭包中受支持:
let obj = FooClass()
let closure = { [weak obj] in ... }
咖喱功能
仅在函数中受支持:
func curriedFunc(x:Int)(y:Int) { ... }
let curried = curriedFunc(1)
curried(y:2)
与使用闭包相似但不完全相同:
let closure = { (x:Int) in { (y:Int) in ... }}
<强>泛型强>
仅在函数中受支持:
func function<T>(x:T) { ... }
来自其初始声明的可引用性
仅在全局功能中受支持:
func recursive(var x:Int) -> Int {
...
return condition ? x : recursive(x)
}
你也可以使用闭包来做到这一点:
var recursive:((Int) -> Int)!
recursive = { (var x) in
...
return condition ? x : recursive(x)
}
但不建议这样做,因为这会导致强烈的参考周期。
<强>过载强>
仅在函数中受支持:
func function(a: String) { print("String: \(a)") }
func function(a: Float) { print("Float: \(a)") }
n.b。您可以将它们引用为这样的闭包:
let f:(Float) -> Void = function
答案 1 :(得分:0)
另一个区别:另一个函数内的递归
嵌套函数不能递归:
func foo() {
func bar() { bar() } // does not compile
}
但其他函数中的闭包可以是递归的:
func foo() {
var bar: (() -> ())!
bar = { bar() }
}