关于Swift集合类型的赋值和拷贝行为

前言: 在Swift3中, 这些又发生了改变.

“Swift 中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。”

在Swift3之前的情况:

Swift中数组(Array)和字典(Dictionary)类型均以结构体的形式实现.然而当数组被赋予一个常量或者变量, 或被传递给一个函数或方法时, 其拷贝行为与字典和其他结构体有些许不同.

字典类型的赋值和拷贝行为

无论何时将一个字典实例赋值给一个常量或变量, 或者传递给一个函数或方法, 这个字典都会在赋值或者调用发生时被拷贝.
如果字典实例中所存储的键和值是值类型(结构体或枚举), 当赋值或调用发生时, 都会被拷贝, 是值拷贝, 相反, 如果键和值是引用类型, 被拷贝的将会是引用, 而不是被它们引用的类实例或函数.

var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
var copiedAges = ages

修改:

copiedAges["Peter"] = 24
print(ages["Peter"])
 // 输出 "23"

是值拷贝

数组的赋值和拷贝行为

在Swift中, 数组类型的赋值和拷贝行为要比字典复杂很多. 当操作数组内容时, 数组能提供接近C语言的性能, 并且拷贝行为只有在必要时才会发生.
如果你将一个数组实例赋值给一个变量或常量, 或者将其作为参数传递给函数或方法调用, 在事件发生时数组的内容不会被拷贝. 相反, 数组公用相同的元素序列. 当你在一个数组内修改某一个元素, 修改结果也会在另一数组显示.
对数组来说 拷贝行为仅仅当操作有可能修改数组长度时才会发生. 这种行为包括了appending. inserting. removing或者使用范围下边去替换这一范围内的元素. 只有当数组拷贝确定要发生时, 数组内容的行为规则与字典中键值得相同.

var a=[1,2,3]
var b=a
var c=a

使用下标语法以得到数组的第一个元素

 print(a[0]) 
// 1
 print(b[0]) 
// 1
print(c[0]) 
// 1

如果通过下标语法修改数组中某一元素的值, 那么a,b,c中的对应值都会发生改变.当用下标语法修改某一值时, 并没有拷贝行为伴随发生, 因为下标语法修改值时没有改变数组长度:

a[0] = 42
print(a[0])
// 42
 print(b[0])
// 42
 println(c[0])
// 42
Swift 管理所有的值拷贝以确保性能最优化的性能,所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化)

然而当你给a附加新元素时, 数组的长度会改变, 当附加元素这一事件发生时, Swift会创建这个数组的一个拷贝, 从此以后, a将会是原数组的一个独立拷贝. 从此以后, a将会是原数组的一个独立拷贝. 拷贝发生后, 如果再修改a中元素值得话, a将会返回与b,c不同的结果,因为后者引用的是原来的数组.

a.append(4)
a[0] = 777
print(a[0])
// 777
print(b[0])
// 42 
print(c[0])
// 42
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容