Swift结构体和类

最近在学习,顺便总结和记录一下

结构体和类

要说结构体和类就需要先说说值类型和引用类型了

Swift的类型分为值类型和引用类型两种

  • 值类型: 在传递和赋值时进行复制,如struct,enum。所有内建类型(包括Int,Bool,String, Array, Dictionary)(OC和Swift区别之一)
  • 引用类型: 只会使用引用对象的一个“指向” ,如class

类与结构体的主要相同点

  • 定义属性用于存储值。
  • 定义函数以提供功能。
  • 定义下标,以便用下标语法来访问它们的值。
  • 通过扩展来扩展它们的默认实现。
  • 利用协议来完成特定标准功能。

类与结构体的主要不同点

  • 类:引用类型。 结构体: 值类型,在设计结构体时,我们可以要求编译器保证不可变性。
  • 内存的管理方式有所不同,类的实例只能通过引用来间接地访问。类能有很多个持有者.需要自己管理其引用计数、引用值得变化。 结构体可以被直接持有及访问,不会被引用,但是会被复制。也就是说,结构体的持有者是唯一的。
  • 类:可以继承,结构体(以及枚举): 不能被继承的。

结构体的一些说明

  • 结构体只有一个持有者,所以它不可能造成引用循环。而对于类和函数这样的引用类型,我们需要特别小心,避免造成引用循环的问题。
  • 值总是需要复制这件事情听来可能有点低效,不过,编译器可以帮助我们进行优化,以避免很 多不必要的复制操作。因为结构体非常基础和简单,所以这是可能的。结构体复制的时候发生 的是按照字节进行的浅复制。除非结构体中含有类,否则复制时都不需要考虑其中属性的引用 计数。当使用 let 来声明结构体时,编译器可以确定之后这个结构体的任何一个字节都不会被改变。
  • 如果一个结构体只由其他结构体组成,那编译器可以确保不可变性。同样地,当使用结构体时,编译器也可以生成非常快的代码。举个例子,对一个只含有结构体的数组进行操作的效率,通常要比对一个含有对象的数组进行操作的效率高得多。这是因为结构体通常要更直接:值是直接存储在数组的内存中的。而对象的数组中包含的只是对象的引用。最后,在很多情况下,编译器可以将结构体放到栈上,而不用放在堆里。

几个相关的名词

值类型

每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct)、枚举(enum) 或者元组(tuple)的形式出现。

值语义

结构体只有一个持有者。比如,当我们将结构体变量传递给一个函数时,函数将接收到结构体的复制,它也只能改变它自己的这份复制。这叫做值语义,有时候也被叫做 复制语义。

引用类型

每个实例共享同一份数据来源,一般以类(class)的形式出现。

引用语义

而对于对象来说,它们是通过传递引用来工作的,因此类对象会拥有很多持有者, 这被叫做引用语义

下面用代码来验证一下值类型和引用类型

首先定义一个打印内存地址的函数

// 打印对象内存地址
func printAddress(values: AnyObject...) {
    for value in values {
      print(Unmanaged.passUnretained(value).toOpaque())
    }
    print("-----------------------------------------")
}

然后定义一个类和一个结构体

class ObjectTest: NSObject {
    var t1 = 0
}

struct StructTest {
    var t1 = 0
}

给类和结构体分别赋值,打印下结果

let objectTest = ObjectTest()
let objectTest1 = objectTest
objectTest1.t1 = 1
print(objectTest.t1)
print(objectTest1.t1)
let structTest = StructTest(t1: 0)
var structTest1 = structTest
structTest1.t1 = 100
print(structTest.t1)
print(structTest1.t1)
1
1
0
100

给其中一个类objectTest1的t1赋值,然后objectTest的t1随之发生改变,但是结构体structTest1只改变了当前自己的t1,而structTest的t1并没有发生改变。上面说了类和结构体分别是引用类型和值类型,也就是说引用类型和值类型对应发生上面的情况,值类型每个实例保留了一分独有的数据拷贝,而每个实例共享同一份数据来源

验证, 打印结果

printAddress(values: objectTest, objectTest1)
printAddress(values: structTest as AnyObject, structTest1 as AnyObject)
0x000060400001be60
0x000060400001be60
-----------------------------------------
0x0000604000446000
0x0000604000446030
-----------------------------------------

结论

值类型复制的时候,两者的内存地址并不一样。相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响。值类型就好像身份证复印件一样,复印出来之后,修改原件上面的内容,复印件上的内容不会变。

引用类型复制的时候,因为两者的内存地址是一样的。相当于默默地创造了一个共享的实例分身,两者是共用一套数据。因此修改其中任何一个实例的数据,也会影响到另外那个。

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

推荐阅读更多精彩内容