遗传性白癜风能治好吗 http://www.baidianfeng51.cn/baidianfengzixun/wuliliaofa/294.html

Swift标准库提供的一个重要功能是通用容器Array和Dictionary。本文将说明如何高效地使用这些类型。

建议:在数组中使用值类型

在Swift中,类型可以分为两个不同的类别:值类型(结构,枚举,元组)和引用类型(类)。它们的一个关键区别是,值类型不能包含在NSArray中。因此,当使用值类型时,优化器可以消除Array中大部分的开销,这些开销对于处理将数组支持NSArray的可能性是必需的。

此外,与引用类型相反,值类型仅在递归包含引用类型时才需要引用计数。通过使用没有引用类型的值类型,可以避免额外的保留,释放Array内部的空间。

//Dontuseaclasshere.structPhonebookEntry{varname:Stringvarnumber:[Int]}vara:[PhonebookEntry]

请记住,在使用大的值类型和使用引用类型之间需要权衡。在某些情况下,复制和移动大的值类型的开销将超过消除桥接和保留/释放开销的成本。

建议:当不需要NSArray桥接时,将ContiguousArray与引用类型一起使用

如果您需要引用类型的数组,并且该数组不需要桥接到NSArray时,请使用ContiguousArray而不是Array:

classC{...}vara:ContiguousArrayC=[C(...),C(...),...,C(...)]建议:使用适当的突变代替对象重新分配

Swift中的所有标准库容器都是值类型,使用COW(写时复制)来执行拷贝,而不是显式拷贝。在许多情况下,这允许编译器通过保留容器而不是执行深拷贝来排除不必要的拷贝。仅当容器的引用计数大于1并且容器发生突变时,才通过复制基础容器来完成此操作。例如,在下面的示例中,将c分配给d时不会发生拷贝,但是当d通过添加2进行结构突变时,将拷贝d,然后将2添加到d:

varc:[Int]=[...]vard=c//Nocopywilloccurhere.d.append(2)//Acopy*does*occurhere.

如果用户不小心,有时COW可能会引入其他意外副本。这方面的一个示例是尝试通过函数中的对象重新分配执行变异。在Swift中,所有参数都以+1传递,即参数保留在调用点之前,然后在被调用者的末尾释放。这意味着如果编写如下函数:

funcappend_one(_a:[Int])-[Int]{vara=aa.append(1)returna}vara=[1,2,3]a=append_one(a)

由于赋值的原因,a可能是一个拷贝,尽管a在append_one之后没有使用。可以通过使用inout参数来避免这种情况:

funcappend_one_in_place(a:inout[Int]){a.append(1)}vara=[1,2,3]append_one_in_place(a)预览时标签不可点收录于话题#个上一篇下一篇



转载请注明地址:http://www.muhudiea.com/mhdzz/5491.html