Swift 结构体和类的区别

Struct 和Class的区别

不同点#####相同点

1.结构体属于值类型,类属于引用类型;
2.值类型赋值给let var 或者函数传参的时候完,全是深拷贝;
3.引用类型赋值给let var 或者函数传参的时候完,是将内存地址拷贝一份,属于浅拷贝;
4.结构体属于值类型,标准库中的结构体采用copy on write策略,优化效率;
5.结构体不可以继承,可以继承;
6.都可以实现方法,都可以添加计算属性和存储属性,都支持属性监听,都支持扩展.都可以遵守协议.结构体的方法修改属性的时候需要用@mutating修饰(枚举也需要);
7.结构体初始化的时候必须要给属性赋值,来决定结构体在内存中的布局.Class初始化的时候可以暂时不用赋值;
8.结构体声明属性的时候不需要赋值,class 声明属性的时候必须赋值或者包装成Optional;
9.required关键字只支持Class, Class可以用static和Class 关键字修饰静态方法;Struct 只能用Static 修饰;

Class的初始化

初始化required修饰的指定初始化器,子类必须要实现同样的指定初始化器,要么继承要么在子中用required重写父类的指定初始化器;
init?可失败初始化器;
指定初始化器;
可选初始化器;

属性观察期

willset\didset

2,类一定是分配在堆空间上,结构体可能分配在堆空间:比如类中的结构体属性,栈空间:比如声明在方法中,数据段:声明为全局变量

3.存储类型和计算类型

都属于实例属性:只能通过实力去访问
lazy var 是一种延迟的存储类型.存储属性存储在对象或者结构体的内存中,计算属性不占用结构体或者对象的属性.

3.1类型属性 添加static/class修饰

整个程序运行期,只有一份比如单例;
存储类型属性:
计算类型属性:

4.属性观察期

非lazy的var的存储属性,计算属性不能设置属性观察器;但是在初始化的时候设置不会触发(包括在init和定义的时候赋值)

5.计算属性和观察期同样适用与局部变量和全局变量

6.inout

传入存储属性:传入结构体或者对象的地址,然后找到存储属性的值,直接访问或者修改;
传入添加了属性观察器的存储属性:传入结构体或者对象的地址,然后在函数内部开辟一段局部变量作为临时存储,并把这个临时地址传入set方法内重新设置,在此之前会调用willset方法,设置完调用didiset方法;
传入计算属性:传入结构体或者对象的地址,然后先调用计算属性的get方法,然后在函数内部开辟一段局部变量作为临时存储,并把这个临时地址传入set方法内重新设置.

7.方法

类方法和实例方法 也是通过static修饰来区别.用法和OC以一样

7.mutating 用于结构体和枚举这种值类型,在自身的实例方法中修改自身属性

struct Person {
    var x = 1
    mutating func add(num:Int){
        x += num
    }
}
var p = Person()
p.add(num: 1)
enum Dog{
    case big, small
    mutating func change() {
        switch self {
        case .big:
            self = .small
        case .small:
            self = .big
        }
    }
}
var dog = Dog.big
dog.change()
print(dog)

7.@discardableResult用于消除返回函数未使用的警告

8.下标函数

使用subscript可以给任何类型(枚举、结构体、类)增加下标功能;subscript的语法类似于实例方法,计算属性,本质就是方法(函数);
不同点在于结构体中的subscript必须实现set方法才能通过p[0] = 10修改值,但是Class的只需要实现get方法就可以实现p[0] = 10赋值,原因是前者是值拷贝,后者是引用拷贝.

struct Person {
    var x = 1, y = 1
    subscript(index:Int) -> Int{
        set {
            if index == 0 {
               x = newValue
            } else {
                y = newValue
            }
        }
        
        get {
            index == 0 ? x : y
        }
    }
}

var p = Person()
p[0] = 10
p[0]

9.继承

值类型不支持继承,只有类支持继承;
swift不像OC任何类都要继承自某一个类;
重写方法重写下标:calss 修饰的类型方法可以通过override重写,但是static修饰的则不可被重写
重写实例属性:可以把父类的存储属性重写为计算属性,只能重写var属性,重写之后权限大于等于夫类
重写类型属性::calss 修饰的计算属性可以通过override重写,但是static修饰的则不可被重写. 存储属性不可以被calass修饰
属性观察期:可以在子类中为计算属性和存储属性添加属性观察,
不希望继承重写用final修饰
9.1内存结构
前八个字节存放类的基本信息,通过八个字节指向堆空间的一段内存,可以找到方法实现。接下来的八个字节存放类的引用计数。再往后是类的属性的内存地址。

9.多态

OC:runtime
swift:通过前八个字节去查找堆上方法的实现

10.协议、元类型

Self.Type/Perosn.self是类的原类其实就是类的对象的前八个字节的内容,通过元类型可以动态创建类的实例;
协议:可以被类、枚举、结构体遵守;可以继承,可以添加属性和方法,可以定义初始化器,协议约定的方法属性必须要实现,协议可以通过 & 组合作为参数的约束条件,类似于 ;
Any\Anyobject\Anyclass:任意类型,任意对象,任意元类对象

11.Error

12.关联类型

13.some

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

推荐阅读更多精彩内容

  • Swift的类和结构体具有以下相同的特点: 可以定义属性来保存值 可以定义方法来提供功能 可以定义下标来使用他们的...
    GA_阅读 417评论 0 0
  • 在Swift语言中结构体和类有什么异同? ① 在大多数语言中,结构体和类都有明显的差异,结构体通常用来定义一组数据...
    丶小虎阅读 776评论 0 2
  • 1.结构体是值类型,存储于栈区,因此少量内存用结构体2.类是引用类型,存储于堆区,对于大量数据采用类核心选择点1....
    Sharif_su阅读 174评论 0 2
  • Swift3.0 - 真的很简单Swift3.0 - 数据类型Swift3.0 - ArraySwift3.0 -...
    酷走天涯阅读 8,632评论 5 36
  • 类和结构体 类和结构体对比 共同点 定义属性用于存储值 定义方法用于提供功能 定义下标操作使得可以通过下标语法来访...
    猹_阅读 207评论 0 0