zoukankan      html  css  js  c++  java
  • Swift-structures 和 classes 初始化

    class

      太长不看版

      Delegate关系

      1. 子类的 designated init 必须调用父类的 designated init, 并且属于子类但是不属于父类的属性要在super.init()前赋值

      2. 子类的 designated init 不能调用父类的 convenience init

      3. 子类的 convenience init 同样不能调用父类的 convenience init

      4. convenience init 必须调用该类的 designated init

      一旦子类定义了自己的designated init,子类就不继承父类的初始化函数

      Inherit关系

      1. 子类override父类的designated init,子类可以同时使用父类的convenience init。所以,想要继承父类的convenience init,首先要继承这个convenience init 调用的 designated init

      2. 子类override父类的designated init,但是想要子类init的参数更少或处理一些值,可以将override的designated initializer写为convenience initializer

        convenience override init(...) {}

      分割线

    • 子类初始化顺序
    1. 子类自己需要初始化的参数
    2. 调用父类相应的初始化方法 super.init()
    3. 对父类中需要改变的成员进行设置
    • Designated, Convenience, Required
      • required init: 希望子类中一定实现的designated init,required强制子类重写init方法,可以保证父类的convenience init可以使用
      • class ClassA {
         ...
         required init(num:Int) {
           numA = num
         }
         ...  
        }
        
        class classB {
         ...
         required init(num:Int) {
           numB = num + 1
           super.init(num:num)
         }
         ..
        }
      • convenience init:
        • 必须调用同一个类中的designated init完成设置
        • 不能被子类重写
        • 不能在子类中用super的方法调用class ClassA {  let numA: Int  init(num: Int) {
        •       numA = num
            }
          
            convenience init(bigNum:Bool) {
                self.init(num:bigNum?10000:1)
              }
          
          }
          
          class ClassB:ClassA {
            let numB: Int
          
             override init(num:Int) {
                numB = num + 1
                super.init(num:num)
             }
          
          // 只要在子类中重写了父类的init方法,在子类中也可以使用父类的convenience init方法
          let objB = ClassB(bigNum: true)
          // objB.numA = 10000, objB.numB = 10001
          // ClassB.convenience init => num = 10000 => ClassB.init => numB = num + 1 = 10001 => ClassA.convenience init => num = 10000 => ClassA.init => numA = 10000

        • 重写ViewController的init方法 

        • //ViewController.swift
          
           convenience init(parameters:Any) {
                  self.init()
                  self.parameters = parameters
            }
      • designated init: 在init里对let的实例常量进行赋值
        • class ClassA {
             let numA:Int
             init(num: Int) {
                numA = num  
            }        
          }
          
          class ClassB:ClassA {
            let numB:Int
            
            override init(num:Int) {
               numB = num + 1
               super.init(num:num)
            }  
          }
  • 相关阅读:
    kerberos认证原理---讲的非常细致,易懂(转发)
    CDH安装之篇四:启用Kerberos认证(转发)
    RabbitMQ和Kafka(转发)(待续)
    Kafka的Log存储解析(转发)(待续)
    滴滴passport设计之道:帐号体系高可用的7条经验(含PPT)(转发)(待续)
    淘宝的消息中间件(2013) (转发)(待续)
    设计消息中间件时我关心什么?(解密电商数据一致性与完整性实现,含PPT)(转发)
    一种提高微服务架构的稳定性与数据一致性的方法(转发)
    大型网站架构系列:消息队列(转发)
    Kafka实战解惑(转发)
  • 原文地址:https://www.cnblogs.com/HackHer/p/8459699.html
Copyright © 2011-2022 走看看