构造函数的基础
构造函数是一种特殊的函数
- 主要用来在创建对象时初始化对象
- 为对象成员变量设置初始值
在OC中的构造函数是initwithxxx,在swift中由于支持函数重载,所有的构造函数都是init
重载overload的概念
- 函数名相同
- 参数类型和个数不同
重写override的概念
父类存在相同的方法
-
子类重新编写父类方法实现
import UIKit /** 1.给自己的属性分配空间并且设置初始值 2.调用父类的构造函数,给父类的属性分配空间设置初始值 NSObject 没有属性,只有一个成员变量isa */ // Class 'Person' has no initializers //Person类没有‘初始化’s,构造函数,可以有多个,默认的是init class Person: NSObject { var name: String // Overriding declaration requires an 'override' keyword //重写 -> 父类有这个方法,子类重新实现,需要override关键字 // Property 'self.name' not initialized at implicitly generated super.init call //implicitly(隐式生成的super.init)调用父类的构造函数之前,属性 self.name没有被初始化 override init() { print("person init") name = "zhang" //Property 'self.name' not initialized at super.init call //在调用父类super.init的时候,没有给self.name初始化->分配空间,设置初始值 super.init() //name = "li" } }
调用:
//在swift中所有的类都默认有一个命名空间
//同一个person类可以从属于不同的命名空间
import UIKit
/**
在swift中,默认同一个项目中(同一个命名空间下),所有的类都是共享的,可以直接访问,不需要import
所有的对象属性var,也可以直接访问到
*/
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//实例化person
// ()-> alloc/init
//swift中对应一个函数init()构造函数
//作用:给成员变量分配空间,初始化成员变量
let p = Person()
print(p)
print(p.name)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
接着来个子类继承父类的重写:
import UIKit
class Student: Person {
//学号
var no:String = ""
//重写person的构造函数,父类方法不能满足需求
override init() {
print("student init")
no = "001"
super.init()
}
}
调用:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//实例化person
// ()-> alloc/init
//swift中对应一个函数init()构造函数
//作用:给成员变量分配空间,初始化成员变量
let p = Person()
let s = Student()
print(s.name + "-----" + s.no)
print(p)
print(p.name)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
打印的如下:
person init
student init
person init
zhang-----001
<_08_构造函数.Person: 0x610000050110>
zhang
student继承自person,所以可以访问到person中的属性,也可以重写父类的方法。