14:swift-初始化

 

 

正文

/*初始化
 
 *** 1: 初始化是为类、结构体或者枚举准备实例的过程。
    1.1:没有返回参数
    1.2:初始化所有的属性。
    1.3:需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。
 
    
    你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。
    不同于 Objective-C 的初始化器,Swift 初始化器不返回值。
    这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。
 
 
 */
import UIKit

class Init14VC: UIViewController {
    var name: String;
    
    // 3:可选属性类型 可选类型可以不用在初始化方法中初始化、可选类型的属性自动地初始化为 nil。
    var age: Int?
    
    // 4: 在初始化中分配常量属性,常量属性,只能够在初始化的时候修改值,一旦声明就不能够修改。
    let height: Float
    
    /* 2: 初始化器
     始化器在创建特定类型的实例时被调用,使用 init 关键字来写:
     init和initcode两个方法必须写
     2.1:构造函数的执行顺序
     a.构造函数的目的:给自己的属性分配空间并且设置初始值
     b.调用父类构造函数之前,需要先给本类属性设置初始值
     c.调用父类的‘构造函数’,给父类的属性分配空间设置初始值
     NSObject 没有属性,只有一个成员变量 ‘isa’
     */
    
    /* *****8: 指定初始化器
         因此 Swift 中类的初始化顺序可以总结如下:

             1:初始化自己的成员变量,必须;
             2:调用父类初始化方法,如无需第三步,则这一步也可省略;
             3:修改父类成员变量,可选。
     */
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        // 初始化方法: 调用父类的初始化之前需要把自己的属性初始化
        self.name = "张三"
        self.height = 170
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        // *****所有属性写在init之前
        self.name = "张三"
        self.height = 170
        super.init(coder: coder)
        fatalError("init(coder:) has not been implemented")
    }
    
    // *****9: 便捷初始化器 所有属性写在init之后
    convenience init(name: String, height: Float) {
        //
        self.init(nibName: nil, bundle: nil)
        // **** 所有属性写在init之后
        self.name = name
        print("初始化方法")
    }

   
    
    /* 7:类的继承和初始化
        所有类的存储属性——包括从它的父类继承的所有属性——都必须在初始化期间分配初始值。
        Swift 为类类型定义了两种初始化器以确保所有的存储属性接收一个初始值。这些就是所谓的指定初始化器和便捷初始化器。

     指定初始化器和便捷初始化器
     
     
     */
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        self.title = "14:初始化"
        
        
        testStructInit()
        
    }
    
    
    // 5:默认初始化器, 所有的属性设置一个默认的值,这样会有一个默认的初始化器
    
    /*
     6:测试结构体成员初始化器 参数是有顺序的,
        name是第一位,age是第二位,height是第三位,后边的参数不能够在前面参数的前面
        前面的参数可以省略
     */
    func testStructInit() {
        let newPeople = NewPeople(name: "张三", age: 18, height: 170)
        print(newPeople)
      
        let newPeople1 = NewPeople(age: 18, height: 170)
        print(newPeople1)
        
    }
    
    /* 指定初始化器和便捷初始化器
     指定初始化器必须总是向上委托。
     便捷初始化器必须总是横向委托。
 
     */
    
}

// 6:结构体类型的成员初始化器

struct NewPeople {
    var name = ""
    var age = 0
    var height = 170.0
}

 

posted on 2023-03-08 17:38  风zk  阅读(56)  评论(0编辑  收藏  举报

导航