知识点总结:
1、结构体
1.1、默认初始化方法:1、空初始化方法;2、成员初始化方法
struct Person{ var name = "tom" var age = 1 } let person = Person()//空初始化方法 print("person:name=\(person.name),age=\(person.age)") let person1 = Person(name:"JIM",age:3)//成员初始化方法 print("person:name=\(person1.name),age=\(person1.age)")
1.2、自定义初始化方法和委托初始化方法
一旦有了自己的初始化方法,swift就不会提供默认的初始化方法。swift编译器允许在初始化过程中初始化常量属性。
struct Person{ var name:String let age:Int init(name:String,age:Int){ self.name = name self.age = age } //委托初始化 init(name:String){ self.init(name: name, age: 2) } } let person1 = Person(name:"JIM",age:3) print("person:name=\(person1.name),age=\(person1.age)")
2、类初始化
2.1、默认初始化方法
swift 只会提供一个默认的空初始化方法。
2.2 指定初始化方法和便捷初始化方法
一般来说,类不会继承父类的初始化方法,因为swift希望避免子类在不经意间提供无法为所有属性赋值的初始化方法(子类经常会增加父类不存在的属性)。让子类提供自己的初始化方法可以避免实例被不完整的初始化方法初始化。不过,类确实会在一些情况下自动继承父类的初始化方法。如果子类为所有新增的属性提供了默认值,那么在以下两种场景下,类会继承父类的初始化方法。
- 如果子类没有定义任何指定初始化方法,就会继承父类的指定初始化方法。
- 如果子类实现了父类的所有指定初始化方法(无论是通过显示实现还是隐式继承),就会继承父类的所有便捷初始化方法
class Person{ var name:String let age:Int init(name:String,age:Int){ self.name = name self.age = age } convenience init(name:String){ self.init(name: name, age: 0) } } class Student:Person{ var score = 90 } let stu = Student(name: "li")//因为子类所有新增属性提供了默认值,所以继承父类的指定构造函数和便捷函数
class Person{ var name:String let age:Int init(name:String,age:Int){ self.name = name self.age = age } convenience init(name:String){ self.init(name: name, age: 0) } } class Student:Person{ var score:Int override init(name: String, age: Int) { self.score = 40 super.init(name: name, age: age) } } let stu = Student(name: "li")//因为子类实现父类所有的置顶初始化方法,所以继承父类的指定构造函数和便捷函数
2.3、必需初始化方法
一个类可以要求子类提供特定的初始化方法。
class Person{ var name:String let age:Int required init(name:String,age:Int){ self.name = name self.age = age } } class Student:Person{ var score:Int required init(name: String, age: Int) { self.score = 40 super.init(name: name, age: age) } }
2.4、反初始化
class Person{ var name:String let age:Int init(name:String,age:Int){ self.name = name self.age = age } deinit { print("deinit") } }
3、可失败的初始化方法
class Person{ var name:String let age:Int init?(name:String,age:Int){ self.name = name self.age = age } } struct Town{ var region = "left" init?(region:String) { self.region = region } }