zoukankan      html  css  js  c++  java
  • 类的初始化分析要点代码

    分析要点:

    1、初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程

    2、初始化的主要目的:对内部的存储属性赋值

    3、结构:如果不自觉添加初始化,会自动添加默认init和memberwise init

    类的初始化:代码如下

    class YY

    {

     var i:int// 会报错,因为没有初始值(存储属性)

    }

    //NN没有构造器

    class NN{

    var i:int

    init(a:int){i=1}

    }

    //黄金规则1:实例化之后所有的存储属性必须有值(两种赋值方法)

    //专门(特定)的初始化器designated initiliazer

    //作用:给本类的所有存储属性赋值

    class AA{

    var m:int()

    var n:int

    init(mm:int,nn:int)

    {

     m=mm

     n=nn

    }

    init()

    {

    m=111

    n=22

    //这里会报错,表明特定的init之间不能相互调用

    //所以建议:实际每个类只写一个特定的初始化器

    //self.init(mm:111,nn:222)

    }

    //便利的初始化器需要调用专门的初始化器(直接或间接都可以)

    convenience init (mm:int)

    {

    self.init(mm:mm,nn:1)

    }

    convenience init(nn: Int){
    //self.init(mm:1,nn:2)
    self.init(mm:nn)
    }

    }


    //**************有了继承****
    //class Parent {
    // var i:Int = 1
    // // var m: String? //只有可为nil的类型会有默认值
    //
    // var m: Int
    // init(m: Int) {
    // self.m = m
    // }
    //}
    //
    //class Child :Parent {
    // var n: Int
    // init(n: Int) {
    // //阶段一
    // self.n = n //先把自己的活干完
    // super.init(m: 1)//在叫父类干
    // //阶段二
    // m = 2//不满意父类的,就自己干
    //
    // }
    //
    //}
    /**
    专门初始化器:
    1.可以有多个
    2.互相不能调用,每一个负责实现所有本类存储属性的初始化
    3.负责处理继承过来的存储属性的初始化。
    3.1 相信别人,所以表现就是调用父类的特定初始化器(不能
    调用父类的便利初始化器)
    便利的初始化器:
    1.可以有多个
    2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器
    3.最终一定是调用本类的特定初始化器
    */

    //*******初始化器的继承***********

    class P{
    var m: Int
    init(m: Int) {
    self.m = m
    }
    init(m: Int,f: Bool) {
    self.m = m
    }
    convenience init() {
    self.init(m: 1)
    }

    }
    class C: P{
    var n: Int = 1
    override init(m: Int) {
    super.init(m: m)
    }
    override init(m: Int, f: Bool) {
    super.init(m: m, f: f)
    }

    // init(n: Int) {
    // self.n = n
    // super.init(m: 1)
    // }
    }
    /*默认情况下,子类不会继承父类的构造器
    如果想让子类继承父类的构造器,有以下几个条件
    1.自己的属性必须已经赋值(声明时)
    2.会继承父类的特定初始化器
    3.如果子类把父类所有的特定初始化器都实现了,
    那么子类也会继承父类的所有便利初始化器


    */

    //let ins = C(


    //***********可失败的
    class FailureClass {
    var name:String
    init?(name:String) {

    self.name = name
    if name.isEmpty { return nil}


    }
    }
    //返回的是一个可为nil的类型
    let ins = FailureClass(name: "dasf")
    ins?.name
    if let xx = ins {
    xx.name
    }
    ins!.name

  • 相关阅读:
    mysql在windows下备份&恢复数据库语句
    Postman(三)、获取响应数据
    LoadRunner(八)、常用的接口压测格式
    LoadRunner(七)、集合点
    LoadRunner(六)、事务
    LoadRunner(五)、参数化之文本参数化
    repmgr安装使用
    PostgreSQL 游标的种类
    win server 2019 资源管理器 内存占用高
    给MySQL中某表增加一个新字段,并设为主键值为自动增长。
  • 原文地址:https://www.cnblogs.com/tyty/p/4951079.html
Copyright © 2011-2022 走看看