-
相同点
- 都可以用变量属性存储值
- 都可以用构造器初始化值
- 都可以定义函数
-
不同点
- 类可以继承,结构体不能继承
- 类有引用计数,结构体没有引用计数
- 类是引用类型,结构体是值类型,结构体传递时候是值的拷贝
- 结构体有成员逐一构造器,类没有
-
简单使用
struct Size {
var width: Double = 0
var heigtht: Double = 0
func description() {
print("width:\(width) height:\(heigtht)")
}
}
class React {
var size = Size()
var area: Double {
get {
return size.width * size.heigtht
}
}
func description() {
print("size:\(size) area:\(area)")
}
}
var size = Size()
var react = React()
size.description()
react.description()
react.size.width = 10
react.size.heigtht = 15
react.description()
- 结构体有成员逐一构造器
struct Size {
var width: Double = 0
var heigtht: Double = 0
func description() {
print("width:\(width) height:\(heigtht)")
}
}
class React {
var size = Size()
var area: Double {
get {
return size.width * size.heigtht
}
}
func description() {
print("size:\(size) area:\(area)")
}
}
var size = Size(width: 13, heigtht: 15)
size.description()
- 值类型和引用类型
- 结构体,枚举体,字串,基本数据类型都是值类型
- 其实基本数据类型的底层都是结构体
- 值类型传递时候是值的拷贝,实际是两块独立的内存
- 类是引用类型,引用类型传递是传的引用,是共享一块内存
enum Num {
case one, two, three, four
}
var a = Num.one
var b = a
a = .three
if b == .one {
print("内存独立")
}
- 类是引用类型
struct Size {
var width: Double = 0
var heigtht: Double = 0
func description() {
print("width:\(width) height:\(heigtht)")
}
}
class React {
var size = Size()
var area: Double {
get {
return size.width * size.heigtht
}
}
func description() {
print("size:\(size) area:\(area)")
}
}
var size = Size(width: 13, heigtht: 15)
let size1 = size
size.width = 100
size1.description()
var react = React()
var react1 = react
react.size.width = 10
react.size.heigtht = 20
react1.description()
- 判断是否是同一个实例的引用
- 判断是否都是同一个实例的引用用等价于 ===, ! ==
- 判断两个引用是否是一个实例不能用==,会编译不通过。
struct Size {
var width: Double = 0
var heigtht: Double = 0
func description() {
print("width:\(width) height:\(heigtht)")
}
}
class React {
var size = Size()
var area: Double {
get {
return size.width * size.heigtht
}
}
func description() {
print("size:\(size) area:\(area)")
}
}
var size = Size(width: 13, heigtht: 15)
let size1 = size
size.width = 100
size1.description()
var react = React()
var react1 = react
var react2 = React()
react.size.width = 10
react.size.heigtht = 20
react1.description()
if react1 === react {
print("react1 === react")
}else{
print("react1 !== react")
}
if react2 === react {
print("react2 === react")
}else{
print("react2 !== react")
}
-
类与结构体的选择
- 该数据结构只是用来封装一些简单的数据 - 用结构体
- 该数据结构在传递时候是拷贝而不是传引用 - 用结构体
- 该数据机构中存储的值类型属性也能被拷贝而不是引用 - 用结构体
- 该数据结构不用去继承另一个类来拥有父类的属性和行为 - 用结构体
-
swift中的值传递
- swift中的基本数据类型,字串,数组,字典,枚举,结构体底层都是用结构体来实现的,所以都是值类型。传递时候都是会发生拷贝。
- OC中的字典,数组是对象类型,也就是引用类型,所以我们会用copy属性。而swift中是值类型,所以不需要考虑copy了。