这两种类型的闭包有啥区别?
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分配的大小吗?以上是关于这两种类型的闭包有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章