在Swift中复制

如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训

skype:alok.upadhyay32

邮件:meiosdose@gmail.com

应用程式:+ 91–7838552946

嘿,这是我的第一篇文章,是的,我做到了!

我们将涵盖

  1. 复制
  2. 深拷贝
  3. 浅拷贝
  4. 参考类型的深层复制
  5. 写时复制(COW)

我将谈论快速复制对象。 复制可以通过两种方式进行: 复制内容复制参考

复制内容也称为Deep CopyDeep Copy适用于值类型。 例如结构,数组,字典,集合,字符串等。

复制参考也称为浅复制。 浅复制适用于 参考类型。 例如类。

—如何创建引用类型的深层副本?
引用类型的默认副本为浅表副本。 我们还可以通过确认copy(with zone: NSZone? = nil) -> Any.并实现copy(with zone: NSZone? = nil) -> Any.来创建引用类型的深层副本copy(with zone: NSZone? = nil) -> Any.

深度复制示例:

  //首先,我们需要一个值类型。 让我们来个结构。 
/ *具有变量personName和personAge的人员结构* /
struct Person {
var personName:字符串?
var personAge:整数?
}
  //让我们使用Person结构 
  //让我们创建人物对象 
var personObj = Person()

//设置人物属性
personObj.personName =“ Alok”
personObj.personAge = 18

// let创建另一个person对象,并将personObj复制到personObjAnother对象。
var personObjAnother = personObj

//让设置personObjAnother属性
personObjAnother.personName =“ Naitvik”
personObjAnother.personAge = 3

//让print personObj
print(personObj.personName!)//打印“ Alok”
print(personObj.personAge!)//打印18

//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3

在上面的示例中,我们看到在制作深层副本时,source(personObj)和destination(personObjAnother)对象具有自己的副本 。 对新复制的对象所做的更改不会影响源对象。

为什么要深拷贝?

深拷贝不那么容易出现争用情况,并且非常适合多线程环境。 您确定要对其执行更改的对象只会影响同一对象。 它不会对源对象产生任何影响。 这也是Apple在Swift中将集合类型(数组,字典,集合)作为值类型(在Objective C中是引用类型)的原因之一。

浅拷贝示例:

  / *具有变量personName和personAge的personC类* / 
PersonC {
var personName:字符串?
var personAge:整数?
}
  //让我们创建人物对象 
 让personObj = PersonC() 
  //设置人物属性 
  personObj.personName =“ Alok” 
  personObj.personAge = 18 
  // let创建另一个person对象并分配personObj。 
 让personObjAnother = personObj 
  //让设置personObjAnother属性 
  personObjAnother.personName =“ Naitvik” 
  personObjAnother.personAge = 3 
  //让print personObj 
print(personObj.personName!)//打印“ Naitvik”
print(personObj.personAge!)//打印3

//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3

在上面的示例中,我们看到在制作浅表副本时,源对象(personObj)和目的地对象(personObjAnother)具有共享副本。 对新复制的对象所做的更改也会影响源对象。

为什么要浅拷贝?

浅副本的创建速度更快,因为仅共享参考。 创建的副本不会完全在内存中创建新实例,而是仅复制地址/引用。

创建引用类型的深层副本

在iOS中,我们还可以通过确认NSCopying Protocol并实现 copy(with zone: NSZone? = nil) -> Any来创建引用类型的深层副本

参考类型的深层复制示例

  / *具有变量personName和personAge的personD类* / 
/ *我们必须确认NSCopying协议并实现func copy(区域:NSZone?= nil)->任何* /
class PersonDNSCopying {
var personName:字符串?
var personAge:整数?

功能 副本 (区域:NSZone?= nil)->任何{
复制= PersonD()
copy.personName = 自我 .personName
copy.personAge = 自我 .personAge
返回副本
}
  //让我们创建人物对象 
personObj = PersonD()

//设置人物属性
personObj.personName =“ Alok”
personObj.personAge = 18

/ * let创建另一个person对象并分配personObj。
我们现在将使用复制方法执行深层复制。
我们必须确保PersonD确认NSCopying协议
并实现func复制(区域:NSZone?= nil)->任何* /
   personObjAnother = personObj.copy()  ! 人D 

//让设置personObjAnother属性
personObjAnother.personName =“ Naitvik”
personObjAnother.personAge = 3

//让print personObj
print(personObj.personName!)//打印“ Alok”
print(personObj.personAge!)//打印18

//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3

在上面的示例中,我们看到在制作引用类型的深层副本时,source(personObj)和destination(personObjAnother)对象具有自己的副本 。 对新复制的对象所做的更改不会影响源对象。

写时复制(COW)

通过以上讨论,您是否想到了如果不对生成的副本进行任何更改,为什么还要创建一个新副本。 它不会创建重复的内容吗? 如果您的数组有50个元素,将会怎样? 执行复制时,是否会再次创建包含50个元素的新数组? 有思想的人认为:)。

你是对的。 复制不应创建重复的内容,并且仅当在复制的对象中进行了更改时,才应创建新的副本。 也就是说,无论是深层副本还是浅层副本,只有对复制的对象进行更改后,才会创建新副本。

写时复制示例

看一下a的基地址原始值,就像……3920“ Alok”一样。

在将a分配给b之后,让我们看一下a和b的基地址原始值, 两者都类似……3920“ Alok”。 即使在执行复制后,仍未制作新的副本。

将字符串b更改为“ Naitvik”后,让我们再次看一下a和b的基地址原始值, 两者现在不同了。 对于a来说是…. 3920,但是对于b来说是…. 3925。 仅在对复制的对象进行了某些更改之后才能进行新的复制。

因此,写入时复制是一种内置的机制,可以防止在内存中创建重复内容而被保存。

希望你喜欢。 现在就这样。

样例代码:

Google云端硬盘 https://drive.google.com/file/d/1gVfRn2oPyP7GHtlEGOgfLywVkOBGiyS9/view?usp=sharing

比特桶

https://bitbucket.org/alokupadhyay/repos/get/SwiftCopying.zip

我也写在http://iosdose.com/wp/

快乐编码🙂

请通过评论支持我们,喜欢并分享我们的Facebook页面。
YouTube:https://bit.ly/2STjOF3

如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训

skype:alok.upadhyay32

邮件:meiosdose@gmail.com

应用程式:+ 91–7838552946

Interesting Posts