swift的值类型与inout

1、什么是值类型

值类型与引用类型相对,值类型的数据特征是,每一个内存实例都会有一份数据copy。在swift语言中,用struct定义的类型都是值类型,这包括了基本数据类型(Int,String,Double,Float),集合类型(Array,Dictionary,Set)等。值类型在赋值和传递的过程中,会表现出copy数据的性质。

struct Point {
    var x = 0
    var y = 0
}

var point1 = Point()
var point2 = point1

我们定义两个值类型的变量point1、point2,当我们使用point1对point2进行赋值的时候,理论上编译器会创建point2对象,并将point1的数据进行一次copy赋值给point2。如果我们修改了point2的内容,我们会发现point1的内容并没有发生变化。

point2.x = 1
print(point2.x) // 1
print(point1.x) // 0, 对point2的修改不会影响point1的内容

2、值类型的优缺点

  • 线程的目标是提升程序的运行效率,但是由于数据在线程之间的共享所带来的复杂度,大大的削弱了这种性能的提升带来的好处。甚至在复杂的线程锁机制下,在某些情况下线程带来了性能的提升变得微乎其微。值类型的设计可以有效的降低编程问题的复杂度,编译器保证值类型的数据拥有者都持有一份数据的私有copy,这种数据的私有性可以让数据的的持有者安全的修改自己的数据,而不需要担心其它线程可能会修改这些数据而被迫采用使用线程锁。

  • 因为值类型数据有机会直接在栈空间分配内存,所以可以减少堆上内存分配和回收的次数,这对于要在堆上创建大量的小对象而言,值类型表现出了特有的优势。但是理论上,值类型在赋值和传递的过程中总是需要进行copy会带来一定性能的影响,swift使用了很多优化机制,来减轻copy带了的性能影响。

编译器可以将copy操作延时到不得不进行copy的时候再进行操作(比如常常被提到的“写时拷贝”),更进一步来说,当一个结构体不要求在内存空间中连续存放的话,那么当发生“写时copy”的时候,编译器则完全只处理脏数据的copy,而继续共享相同内容的数据。

  • swift语言的设计者重视值类型,将90%的内容都设计为值类型,而且平等的强调了let与var(在很多语言中默认声明的都是变量,常量需要用特殊的关键字来进行修饰)。swift语言中的let关键字与值类型配合可以让不变性在语义上更加完整。
let array = [1,2,3,4,5]
array.append(6) // error!!!!!!!

如果array是一个引用类型,let的声明只能限制array不可以再指向其它内容,但let无法限制我们在array所指向的对象中新增内容(既在数据中新增内容)。但此时array是一个值类型,swift编译器保证用let修饰过的值类型不可变,从而将不变性的语义更加完整。

3、inout

我们现在已经知道,值类型在传递的过程中会进行数据的copy,那么显而易见的是下面改变x的值是不会成功的

var x = 10
func changeX(x: Int) {
    x + = 10
}

changeX(x)
print(x) // 10 x的值不会发生改变

如果我们希望x的值可以被改变,那么我们必须使用引用的方式来传递x。这时候我们就需要使用inout,当我们使用inout的时候,编译器不论当前struct的存放状态如何,都一定会把结构体放入一个连续的内存空间中,并将地址作为参数进行传递。

var x = 10
func changeX(x: inOut Int) { // swift3.0改变了inOut修饰符的位置
    x + = 10
}

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

推荐阅读更多精彩内容