类和结构体

163
  1. 相同点

    1. 都可以用变量属性存储值
    2. 都可以用构造器初始化值
    3. 都可以定义函数
  2. 不同点

    1. 类可以继承,结构体不能继承
    2. 类有引用计数,结构体没有引用计数
    3. 类是引用类型,结构体是值类型,结构体传递时候是值的拷贝
    4. 结构体有成员逐一构造器,类没有
  3. 简单使用

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()
  1. 结构体有成员逐一构造器
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()
  1. 值类型和引用类型
    1. 结构体,枚举体,字串,基本数据类型都是值类型
    2. 其实基本数据类型的底层都是结构体
    3. 值类型传递时候是值的拷贝,实际是两块独立的内存
    4. 类是引用类型,引用类型传递是传的引用,是共享一块内存
enum Num {
    case one, two, three, four
}

var a = Num.one
var b = a

a = .three

if b == .one {
    print("内存独立")
}
  1. 类是引用类型
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()
  1. 判断是否是同一个实例的引用
    1. 判断是否都是同一个实例的引用用等价于 ===, ! ==
    2. 判断两个引用是否是一个实例不能用==,会编译不通过。
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")
}
  1. 类与结构体的选择

    1. 该数据结构只是用来封装一些简单的数据 - 用结构体
    2. 该数据结构在传递时候是拷贝而不是传引用 - 用结构体
    3. 该数据机构中存储的值类型属性也能被拷贝而不是引用 - 用结构体
    4. 该数据结构不用去继承另一个类来拥有父类的属性和行为 - 用结构体
  2. swift中的值传递

    1. swift中的基本数据类型,字串,数组,字典,枚举,结构体底层都是用结构体来实现的,所以都是值类型。传递时候都是会发生拷贝。
    2. OC中的字典,数组是对象类型,也就是引用类型,所以我们会用copy属性。而swift中是值类型,所以不需要考虑copy了。