【问题标题】:What is a difference between these two type of closures?这两种类型的闭包有什么区别?
【发布时间】:2018-07-12 14:30:23
【问题描述】:

通过此链接Difference between closure and Computed property,我知道计算属性和闭包之间的区别。

我们可以用两种方式编写闭包,看一个例子,

var computedProperty:String{
    return "computedProperty"
}

var clouserFirst = { (name: String) -> String in
    return "Hello \(name)"
}

var clouserSecond:String = {
    return "Hello clouserSecond"
}()

如果我在课堂上写两个闭包,那么,

第一次调用第二个闭包,这在上面的链接中进行了解释,之后只返回那些值。
但是当我们调用这个闭包时,第一种类型的闭包是调用,而闭包是一个引用类型。见closure in apple document

我知道计算属性的工作方式与函数一样,因为它不在内存中存储任何值。

所以,我的问题是内存分配如何以两种关闭方式发生。谁能帮我理解这个功能以及这两个闭包之间的区别?

【问题讨论】:

    标签: swift


    【解决方案1】:

    在第一个闭包中,参数作为参数传递,您的 var 是 (String) -> String 类型,而在第二个闭包中,您使用闭包初始化 String var

    主要区别在于两个变量的类型一个是String类型,另一个是(String) -> String闭包类型,换句话说,在第一种情况下,您声明String并在第二种情况下赋值您正在将闭包声明为 var 并分配一个值

    【讨论】:

    • @Reninier Melian 当类内存分配时,分配的 clouser 内存和大小?
    • 我知道,当类分配时,所有属性内存都被分配但不在函数中,因为函数是唯一的用户属性和返回值。与计算属性相同,不分配任何内存,只分配计算和返回值。那么在哪个 clouser 中处理,哪个 clouser 存储值?我想你明白我的意思了。
    • @vikasprajapati 检查这个答案也许可以帮助你stackoverflow.com/questions/39149006/…
    【解决方案2】:

    您在此处定义了两个存储属性。

    1. 第一个是闭包类型,它接受一个字符串参数并返回一个字符串
    2. 第二个是 String 类型(不是闭包),它从闭包中获取值(您在初始化时本身已调用它)

    这两个属性会在它们所在的对象初始化时分配内存。

    让我们尝试调试一下,看看我们是否正确。

    在上面的屏幕截图中,我在创建 Test 对象后停止了调试指针。您可以在调试控制台中看到已初始化存储的属性及其各自的类型。

    在第二个屏幕截图中,我打印了这些属性/变量的内存地址,以确认它们确实是在初始化时创建的。甚至不需要调用closureFirst 来获取内存分配,并且创建stringFromClosure 的闭包在返回由stringFromClosure 持有的字符串后已被销毁。

    【讨论】:

    • 你能找到他们两个clouser分配的大小吗?
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2016-04-18
    • 2020-02-14
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多