【问题标题】:Difference between function and closure assignment函数和闭包赋值的区别
【发布时间】:2015-01-11 14:58:49
【问题描述】:

函数声明之间的swift有什么区别:

func function(a: String) {
    print(a);
}
function("test");

和闭包分配:

let closure = {
    (a: String) in
    print(a);
}
closure("test");

它们之间有什么区别吗?

【问题讨论】:

  • 一个区别是你不能定义柯里化闭包,但你可以定义柯里化函数。另一个区别是你不能定义递归闭包,但你可以定义一个递归函数

标签: function swift closures


【解决方案1】:
  1. 具名或匿名

    func function(a: String) {
        print("\(a), name: \(__FUNCTION__)");
    }
    
    let closure = { (a: String) in
        print("\(a), name: \(__FUNCTION__)");
    }
    
  2. 捕获列表
    仅在闭包中支持:

    let obj = FooClass()
    let closure = { [weak obj] in ... }
    
  3. 柯里化函数
    仅在函数中支持:

    func curriedFunc(x:Int)(y:Int) { ... }
    let curried = curriedFunc(1)
    curried(y:2)
    

    与使用闭包类似,但不完全相同:

    let closure = { (x:Int) in { (y:Int) in ... }}
    
  4. 泛型
    仅在函数中支持:

    func function<T>(x:T) { ... }
    
  5. 来自它自己的初始声明的可引用性
    仅在 全局 函数中受支持:

    func recursive(var x:Int) -> Int {
        ...
        return condition ?  x : recursive(x)
    }
    

    你也可以使用闭包来做到这一点:

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

    但不建议这样做,因为这会导致强引用循环。

  6. 过载
    仅在函数中支持:

    func function(a: String) { print("String: \(a)") }
    func function(a: Float) { print("Float: \(a)") }
    

    n.b.您可以像这样将它们作为闭包引用:

    let f:(Float) -> Void = function
    

【讨论】:

  • "但不推荐这样做,因为这会导致强引用循环。"不,它没有。
【解决方案2】:

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

嵌套函数不能递归:

func foo() {
    func bar() { bar() } // does not compile
}

但是其他函数内部的闭包可以是递归的:

func foo() {
    var bar: (() -> ())!
    bar = { bar() }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2021-10-06
    • 2015-01-19
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多