这两种类型的闭包有啥区别?

Posted

技术标签:

【中文标题】这两种类型的闭包有啥区别?【英文标题】: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。

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

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

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

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

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

在上面的屏幕截图中,我在创建 Test 对象后停止了调试指针。您可以在调试控制台中看到已初始化存储的属性及其各自的类型。 在第二个屏幕截图中,我打印了这些属性/变量的内存地址,以确认它们确实是在初始化时创建的。甚至不需要调用closureFirst 来获取内存分配,并且创建stringFromClosure 的闭包在返回由stringFromClosure 持有的字符串后已被销毁。

【讨论】:

你能找到他们两个clouser分配的大小吗?

以上是关于这两种类型的闭包有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

这两种符号有啥区别?

这两种方法有啥区别?

这两种方法有啥区别

这两种说法有啥区别? [复制]

这两种声明数组的方式有啥区别? [复制]

这两种说法有啥区别?