Swift之类和结构体(上)

208 阅读3分钟
日常开发中结构体都是小伙伴们经常用到的,那就简单的介绍一下咯,说的不对的地方留言一起探讨探讨。
struct/class Person{
    var age: Int
    var name: String
    init(age: Int, name: String){
        self.age = age
        self.name = name
    }
    //类有 结构体没有哦
    deinit{

    }
}
  • 类和结构体的相同点: 1、定义储存值得属性 2、定义方法 3、定义下标以使用下标语法提供对其值得访问 4、定义初始化器 5、使用extension来拓展功能 6、遵循协议来提供某种功能

  • 类和结构体的不同点: 1、类是引用类型存在堆中 结构体是值类型存在栈中 2、类有继承的特性 结构体没有 3、类有析构函数来释放其分配的资源 4、引用计数允许对一个类实例有多个引用

类的初始化器

当前的类编译器默认不会自动提供成员初始化器,但是对于结构体来说编译器会提供默认的初始化方法(前提是我们自己没有指定初始化器)

class Person{
    var age: Int
    var name: String
    init(age: Int, name: String){
        self.age = age
        self.name = name
    }
}

Swift 中创建类和结构体的实例时必须为所有的存储属性设置一个合适的初始值。所以 类 Person 必须要提供对应的指定初始化器,同时我们也可以为当前的类提供便捷初 始化器(注意:便捷初始化器必须从相同的类里调用另一个初始化器。)

class Person{
    var age: Int
    var name: String
    init(age: Int, name: String){
        self.age = age
        self.name = name
    }
    convenience init(){                          //***便捷初始化器***
        self.init(age: 18, name: "床前明月光")     //***重要***
    }
}

这样就会出现下面这种情况(注意子类必须要调用父类的指定初始化器

class Person{
    var age: Int
    var name: String
    init(age: Int, name: String){
        self.age = age
        self.name = name
    }
    convenience init(){
        self.init(age: 18, name: "床前明月光")
    }
}

class Boy:Person{
    var hooby:String
    init(hooby: String){
        self.hooby = hooby
        super.init(age: 18, name: "床前明月光")  //***重要*** 
    }
}

这里我们记住:

  • 指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。
  • 指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖
  • 便捷初始化器必须先委托同类中的其它初始化器,然后再为任意属性赋新值(包括同类里定义的属性)。如果没这么做,便捷构初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。
  • 初始化器在第一阶段初始化完成之前,不能调用任何实例方法、不能读取任何实例属性的值,也不能引用 self 作为值。
可失败初始化器:
class Person{
    var age: Int
    var name: String
    init?(age: Int, name: String){
        if age < 0 {return nil}
        self.age = age
        self.name = name
    }
    convenience init?(){
        self.init(age: 18, name: "床前明月光")
    }
}
必要初始化器
class Person{
    var age: Int
    var name: String
    required init(age: Int, name: String){
        self.age = age
        self.name = name
    }
    convenience init(){
        self.init(age: 18, name: "床前明月光")
    }
}

class Boy:Person{
    var hooby:String
    init(hooby:String) {
        self.hooby = hooby
        super.init(age: 18, name: "床前明月光")
    }
    required init(age: Int, name: String) {   //***重要***
        self.hooby = "学习"
        super.init(age: age, name: name)
    }
}
类的生命周期

github.com/apple/swift