这两种封闭装置有什么区别?

时间:2018-02-02 06:16:59

标签: swift

我知道使用此链接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

我知道计算属性的功能与函数相同,因为它不会在内存中存储任何值。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

  1. 第一个是闭包类型,它接受一个String参数并返回一个String
  2. 第二个是String类型(不是闭包),它从闭包中获取它的值(你在初始化时自己调用它)
  3. 这两个属性将在它们所在对象的初始化时分配内存。

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

    enter image description here

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

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

    enter image description here