iOS-Developer-Swift

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:"孤独求抱")
    }
}
上一篇 下一篇

猜你喜欢

热点阅读