1、类和结构体都可以通过定义属性和添加方法来扩展功能
类和结构体的共同点:通过定义属性存储值;通过定义方法提供功能;通过定义构造器声称初始化值
类与结构体的区别:
类:允许一个类继承另一个;允许引用计数器对一个类的多次引用
结构体:结构体通过复制的方式在代码中传递,不使用引用计数器
2、类与结构体的语法定义
class ClassName{ //类名首字母用大写
//属性和方法 //属性名和方法名的首字母用小写
}
struct StructureName{ //结构体名首字母用大写
//属性和方法 //属性名和方法名的首字母用小写
}
3、实例化类和结构体,访问属性
struct Resolution{
var width = 0
var height = 0
}
class VideoMode{ //定义名为VideoMode的类
var resolution = Resolution() //初始化一个新的Resolution的结构体实例
var interlaced = false //定义一个默认值为false的布尔类型
var frameRate = 0.0
var name: String?
}
//实例化结构体和类
let someResolution = Resolution() //属性都被初始化为默认值
let someVideoMode = VideoMode()
print(someResolution.width) //通过点语法访问属性
print(someVideo. resolution.height) //访问子属性
4、结构体的默认构造器
let initRes1 = Resolution(width:22,height:44) //结构体可设置属性的默认构造器
print("(initRes1.width),(initRes1.height)")//
类没有默认构造器,需要自定义
5、结构体和枚举值的传递都是通过值拷贝
//相当于拷贝了一个副本给initRes2,改变initRes2的属性值不影响initRes1的值
var initRes2 = initRes1
print(initRes1.width) //22
print(initRes2.width) //22改变前的值
initRes2.width = 43
print(initRes1.width) //22
print(initRes2.width) //43改变后的值
enum Direction{
case North,South,East,West
}
var direct1 = Direction.North
var direct2 = direct1
direct2 = Direction.south
print(direct1) //North
print(direct2)//South ,direct2的值改变不会影响direct1
6、类是引用拷贝,拷贝后的值的改变会影响原来的
let videoM1 = ViewMode()
videoM1.name = "videoM1"
//videoM1传递的是一个引用,videoM2还是指向videoM1哪一块内存存储空间
var videoM2 = viedeoM1
videoM2.name = "videoM2"
print(videoM1.name)//videoM2
print(videoM2.name)//videoM2
"==="恒等运算符,用三个等号表示,两个类型的常量或者变量是否引用同一个实例,判断两个引用是否指向同一个对象
print(videoM1===videoM2)
7、类和结构体的选择
结构体:只是用来封装少量简单的数据值;实例被赋值或传递存储的时候需要进行值拷贝,不需要用到继承
类:需要包含复杂的属性方法,能形成一个抽象的事物描述,需要用到继承,需要用到引用拷贝
字符串、数组、字典、的底层都是通过结构体实现的,所以它们在被赋值的时候都是通过值拷贝
当然swift内部会做性能优化,不会只要赋值就拷贝,只有在必要的时候才会进行值拷贝