class Person: NSObject {
var name: Stringvar age: Int
init (name: String, age: Int) {
self.name = name
self.age = age
}
}
let person0 = Person.init(name: "xiaowang", age: 20)
以下四种属性在构造对象过程中,不需要考虑它们是否已被初始化
class Person {
//1.已经初始化了的存储属性var name: String = "xiaowagn"//2.计算属性var kindName: String {
get {
return"亲爱的\(name)"
}
}
//可选属性var girlFriend: String?
//懒加载属性
lazy var pet: String = {
return"xiaobao"
}()
}
//ViewController.swift文件import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//创建对象
let person = Person(dict:["name":"xiaowang", "age": 20, "abc":"456"])
print("name: \(person.name), age: \(person.age)")
}
}
可失败构造器
构造器没有按照预期成功构造对象时,可令其返回nil
可失败构造器,在返回 nil 之前,也必须保证所有属性初始化
class Person: NSObject {
var name: Stringvar age: Int
//多了个问号,表示可失败构造器
init?(name: String, age: Int) {
self.name = name
self.age = age
super.init()
if age >200 { //当符合这个条件时,可让构造器返回nilreturn nil
}
}
}
let person = Person(name: "xiaowang", age: 300)
//构造器返回nil,所有在构造器中初始化的变量值都为nil
print(person?.name) //result: nil
print(person?.age) //result: nil
构造器的继承规则
如果子类没有实现任何父类的指定构造器,则继承所有的父类的指定构造器和便利构造器
如果子类重写了所有的父类的指定构造器,则默认继承父类所有便利构造器
如果没有全部重写父类的指定构造器,则父类的构造器一个也不继承
class Person:NSObject {
var name: Stringvar age: Int
//指定构造函数
init(name: String, age: Int) {
self.name = name
self.age = age
}
init(name: String) {
self.name = name
self.age =25
}
//便利构造函数
convenience override init() {
self.init(name: "宝宝", age: 0)
}
}
//没有没有实现任何父类的指定构造器,则继承所有的父类的指定构造器和便利构造器
class Man: Person{
}
let man = Man() //调用父类的便利构造器
print(man.name) //result:"宝宝"
print(man.age) //result:0let man1 = Man(name: "xiaoming") //调用父类的第二个指定构造器
print(man1.name) //result:"xiaoming"
print(man1.age) //result:25let man2 = Man(name: "xiaohua", age: 20)//调用父类的第一个指定构造器
print(man2.name) //result:"xiaohua"
print(man2.age) //result:20
class Person:NSObject {
var name: Stringvar age: Int
//指定构造函数
init(name: String, age: Int) {
self.name = name
self.age = age
}
init(name: String) {
self.name = name
self.age =25
}
//便利构造函数
convenience override init() {
self.init(name: "宝宝", age: 0)
}
}
//重写所有父类的指定构造函数,默认继承所有父类的便利构造器
class Man2: Person {
//这里如果少重写一个父类的指定构造器,则下面无法调用父类的便利构造器//override 关键字表示重写父类的方法
override init(name: String) {
super.init(name: name)
}
override init(name: String, age: Int) {
super.init(name: name, age: age)
}
}
let man1 = Man2() //调用了父类的便利构造器
print(man1.name) //result:"宝宝"
print(man1.age) //result:0
class Person:NSObject {
var name: Stringvar age: Int
//指定构造函数
init(name: String, age: Int) {
self.name = name
self.age = age
}
init(name: String) {
self.name = name
self.age =25
}
//便利构造函数
convenience override init() {
self.init(name: "宝宝", age: 0)
}
}
//只重写了一部分父类的指定构造函数,父类的构造器一个也不会继承,也就是不能调用
class Man3: Person{
convenience init() {
self.init(name:"xiaoxiao", age:20)
}
//指定构造函数
override init(name: String, age: Int) {
super.init(name: name, age: age)
}
}
let man1 = Man3() //调用的是自己的便利构造器
print(man1.name) //result:"xiaoxiao"
print(man1.age) //result:20