Function 函数和闭包赋值的区别

Function 函数和闭包赋值的区别,function,swift,closures,Function,Swift,Closures,函数声明之间的swift是否存在任何差异: func function(a: String) { print(a); } function("test"); 和关闭分配: let closure = { (a: String) in print(a); } closure("test"); 这两者有什么区别吗 命名或匿名 func function(a: String) { print("\(a), name: \(__FUNCTION__)"); } le

函数声明之间的swift是否存在任何差异:

func function(a: String) {
    print(a);
}
function("test");
和关闭分配:

let closure = {
    (a: String) in
    print(a);
}
closure("test");
这两者有什么区别吗

  • 命名或匿名

    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)
    
    func function<T>(x:T) { ... }
    
    func recursive(var x:Int) -> Int {
        ...
        return condition ?  x : recursive(x)
    }
    
    func function(a: String) { print("String: \(a)") }
    func function(a: Float) { print("Float: \(a)") }
    
    类似,但与使用闭包不同:

    let closure = { (x:Int) in { (y:Int) in ... }}
    
  • 仿制药
    仅在以下功能中受支持:

    func curriedFunc(x:Int)(y:Int) { ... }
    let curried = curriedFunc(1)
    curried(y:2)
    
    func function<T>(x:T) { ... }
    
    func recursive(var x:Int) -> Int {
        ...
        return condition ?  x : recursive(x)
    }
    
    func function(a: String) { print("String: \(a)") }
    func function(a: Float) { print("Float: \(a)") }
    
    您也可以使用闭包进行此操作:

    var recursive:((Int) -> Int)!
    recursive = { (var x) in
        ...
        return condition ? x : recursive(x)
    }
    

    但不建议这样做,因为这会导致强参考循环

  • 过载
    仅在以下功能中受支持:

    func curriedFunc(x:Int)(y:Int) { ... }
    let curried = curriedFunc(1)
    curried(y:2)
    
    func function<T>(x:T) { ... }
    
    func recursive(var x:Int) -> Int {
        ...
        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
    

  • 另一个区别:另一个函数内部的递归性

    嵌套函数不能是递归函数:

    func foo() {
        func bar() { bar() } // does not compile
    }
    
    func foo() {
        var bar: (() -> ())!
        bar = { bar() }
    }
    
    但其他函数中的闭包可以是递归的:

    func foo() {
        func bar() { bar() } // does not compile
    }
    
    func foo() {
        var bar: (() -> ())!
        bar = { bar() }
    }
    

    一个区别是您不能定义curried闭包,但可以定义curried函数。另一个区别是,您不能定义递归闭包,但可以定义递归函数,“但不建议这样做,因为这会导致强引用循环。”不,它不会。