Swift的init方法总结
2019-05-08 本文已影响0人
seasonZhu
/// 研究一下结构体/类/NSObject的一级初始化和便利初始化方法
struct BatMan {
// 对于一个结构体而言,如果定义了属性而没有显式的定义初始化方法,默认的初始化方法会带出所有的属性
let name: String
let age: String
}
struct Robin {
let name: String
let heigth: Float
// 对于一个结构体而言,如果自定义初始化方法,默认的初始化方法就没有了,必须使用自定义的初始化方法
init(name: String) {
self.name = name
self.heigth = 180
}
// 初始化方法不仅只有一个
init(height: Float) {
self.name = "罗宾"
self.heigth = height
}
}
enum SpiderMan {
// 切记枚举也是结构体的一种,也就是说其实你可以使用它做struct一样的事情 只是对于初始化而言 可能就不是那么好了
case normal
case dark
init() {
self = .normal
}
}
struct SuperChild {
// 定义一个结构体 如果什么都没有写 也是可以写出构造方法的
}
class SuperMan {
// 定义一个类 如果什么都没有写 也是可以写出构造方法的
}
class IronMan {
let name: String
let age: String
// 除非是在定义属性的时候已经赋值给属性,否则的话必须在init方法中对其进行赋值
let sex = "Man"
var height: Float
init(name: String, age: String) {
self.name = name
self.age = age
self.height = 178
}
init(name: String, age: String, height: Float) {
self.name = name
self.age = age
self.height = height
}
}
class TestViewController: UIViewController {
var isNeedCheckNetwork: Bool!
convenience init(isNeedCheckNetwork: Bool) {
// 便利构造函数中 一定不会有super 对于属性的赋值 一般在self.init()之后 只有self被初始化后,才能对其进行赋值, 不能使用let修饰属性 var 并且告诉编译器其强制解包 一定有值
self.init()
self.isNeedCheckNetwork = isNeedCheckNetwork
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TestView: UIView {
var isNeedUpdateLayout: Bool
// 对于一个类 一旦自定义了一个初始化方法(注意是初始化方法,不是便利!),那么其原有的初始化方法就无法使用了,init(frame: CGrect)无法被点出来,而且其添加的属性必须要在super之前调用,在一级初始化中,先初始化自己的属性,再初始化super,这点和便利构造函数不同
init(frame: CGRect, isNeedUpdateLayout: Bool) {
self.isNeedUpdateLayout = isNeedUpdateLayout
super.init(frame: frame)
}
// 如果非要使用默认的初始化方法 请重新, 并正确的为其赋值 赋值原则请看上一条
override init(frame: CGRect) {
self.isNeedUpdateLayout = true
super.init(frame: frame)
}
// 对应的是init(frame: CGRect, isNeedUpdateLayout: Bool)这个一级初始化方法
convenience init(isNeedUpdateLayout: Bool) {
self.init(frame: CGRect.zero, isNeedUpdateLayout: isNeedUpdateLayout)
}
// 对应的是override init(frame: CGRect)这个方法
convenience init() {
self.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// 测试用的容器
class Example {
init() {
let _ = BatMan(name: "老爷", age: "未知")
let _ = Robin(name: "老爷的继承人")
let _ = Robin(height: 170)
let _ = SuperMan()
let _ = SuperChild()
let _ = IronMan(name: "钢铁侠", age: "未知")
let _ = IronMan(name: "一首凉凉送给你", age: "未知", height: 180)
let _ = TestView()
let _ = TestView(isNeedUpdateLayout: true)
let _ = TestView(frame: .zero, isNeedUpdateLayout: true)
let _ = TestView(frame: .zero)
let _ = SpiderMan()
}
}