2019-03-06swift 中怎么写init方法
2019-03-07 本文已影响0人
幸福晓杰2016
网上查到的资料
class BaseVC: UIViewController {
init(){
super.init(nibName: nil, bundle: nil)
self.view.backgroundColor = UIColor.red
}
init(name : String ,age : Int) {
super.init(nibName: nil, bundle: nil)
self.view.backgroundColor = UIColor.blue
print(name,age);
}
convenience init(name : String) {
self.init(name: "豆豆", age: 1)
self.view.backgroundColor = UIColor.orange
print(name);
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
//调用方式
var vc : BaseVC = {
var base1 = BaseVC()
var base2 = BaseVC.init(name: "豆豆", age: 18)
var base3 = BaseVC.init(name: "豆豆")
return base1;
---------------------
作者:月月_月
来源:CSDN
原文:https://blog.csdn.net/qq_24656927/article/details/81975810
但是只有代码不能说明很多问题,实践中我发现还有以下几个原则
1.继承自系统类的方法,如果增加了自定变量则必须重新复写init方法
2.自定义的变量必须在super.init()前初始化,排除!与?修饰的变量
3.调用self之前必须先调用super.init(),但是引用自定义变量时除外
4.便利构造函数不能应用super的init方法,只能引用自己类的designed Init方法
我的测试用例如下:
import UIKit
class InitViewController: UIViewController {
var lsVar1:String//必须在init函数里最先初始化
var lsVar2:String!//延迟初始化,最终不能为nil
var lsVar3: String?//可以为nil,可以不初始化
// 复写
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
lsVar1 = "必须初始化"
//print(self)这里就报错:没有superInit不用调用self对象
//self.lsVar1 = "adada", 这样写不报错,但是我们一般不这么写
super.init(nibName: nil, bundle: nil)
print(self)
lsVar2 = "可以晚点赋值"
}
// 必须实现,但是已经不调用了
required init?(coder aDecoder: NSCoder) {
lsVar1 = "Property 'self.lsVar1' not initialized at super.init call"
super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented")
}
// 指定初始化方法 designedInit
init(var1:String,var2:String = ""){
lsVar1 = var1
lsVar2 = var2
// super.init() //报错:Must call a designated initializer of the superclass 'UIViewController'
//上面这个方法不是指定构造函数,下面这个是
super.init(nibName: nil, bundle: nil)
}
//函数名称必须与上面的一个不一样,否则重复
convenience init() {
self.init(var1:"孤独求抱")
}
}