• Swift中类与结构的初始化


    前言:通过学习与研究swift3.0的官方文档关于初始化这部分可以总结为一句话:类与结构是确保一个类型的实例可以使用之前,其所有存储属性都得到了正确的赋值。

    一,结构的初始化1

    复制代码
     1 struct FirstStruct{
     2    
     3     let b:Int
     4     let c:Int
     5     
     6     init() {
     7        b = 2
     8        c = 3
     9         
    10     }
    11 }
    12 
    13 let fs = FirstStruct()
    复制代码

    解析:这个结构中b,c这两个存储属性并未赋初值,而是在init初始化器(相当于Java中的构造函数)中赋初值。

    二,结构的初始化2

    复制代码
    1 struct SecondStruct{
    2     
    3     let b:Int
    4     let c:Int
    5     
    6 }
    7 
    8 let ss = SecondStruct(b:2,c:3)
    复制代码

    解析:结构中,编译器会自动生成memberwise的初始化器,因此在调用结构时必须传入初始化值。

    三,结构中初始化错误示例

    复制代码
     1 //struct ThirdStruct{
     2 //    
     3 //    let b:Int
     4 //    let c:Int
     5 //    
     6 //    init() {
     7 //        b = 0
     8 //    }
     9 //}
    10 //
    11 //let ts = ThirdStruct(c:3)
    复制代码

    注意:结构中声明了初始化器,编译器将不会给我们添加memberwise的初始化器,(原理和Java的空构造函数一致)上面这个例子是不能通过编译的。

    四,结构中init可以通过self关键字调用其他的init

    复制代码
     1 struct FourthStruct{
     2     
     3     let b:Int
     4     let c:Int
     5     
     6     init() {
     7         
     8         self.init(b:2)
     9         
    10     }
    11     init(b:Int){
    12         c = 2
    13         self.b = b
    14     }
    15 }
    16 
    17 let fos = FourthStruct()
    复制代码

    五,类初始化错误示例

    复制代码
    1 //错误示例
    2 //class SecondClass{
    3 //    
    4 //    let b:Int
    5 //    let c:Int
    6 //    
    7 //}
    8 //
    9 //let sc = SecondClass(b:2,c:3)
    复制代码

    解析:类里面也可以通过声明init初始化器,若不提供初始化器,编译器不会提供默认的初始化器

    六,类的(Designated init)初始化器

    复制代码
     1 class Parent2{
     2     var name:String
     3     var height:Int
     4     init(name:String,height:Int){
     5         self.name = name
     6         self.height = height
     7     }
     8 }
     9 let p2 = Parent2(name:"zs",height:168)
    10 p2.height
    11 p2.name
    复制代码

    解析:没有特殊的修饰符的init就是专门的(Designated init)初始化器,主要的作用就是确保所有的存储属性得到初始化

    七,Designated init一般只有一个,可以有多个,根据你调用时赋值的不用而调用不同的初始化器

    复制代码
     1 class Parent3{
     2     var name:String
     3     var sex:String
     4     init(name:String,sex:String){
     5         self.name = name
     6         self.sex = sex
     7     }
     8     init(name:String){
     9         self.name = name
    10         sex = "男"
    11     }
    12     
    13 }
    14 
    15 let p3 = Parent3(name:"zs",sex:"女")
    16 let p4 = Parent3(name:"ls")
    17 p3.sex
    18 p4.sex
    复制代码

    八,类的便利(convenience)初始化器

    复制代码
    class Parent3{
        var name:String
        var sex:String
        init(name:String,sex:String){
            self.name = name
            self.sex = sex
        }
        convenience init(name:String){
            self.init(name:name,sex:"男")
        }
        
        convenience init(){
            self.init(name:"zs")
        }
        
    }
    
    let p3 = Parent3(name:"zs")
    let p4 = Parent3()
    p3.sex
    p4.sex
    复制代码

    解析:通过在初始化器前声明convenience关键字可以声明一个便利初始化器,它的作用是方便创建对象时使用,但它必须直接或间接调用专门初始化器

    九,子类的专门初始化器必须调用父类的专门初始化器,子类不能调用父类的便利初始化器

    复制代码
     1 class Parent4{
     2     var name:String
     3     var sex:String
     4     init(name:String,sex:String){
     5         self.name = name
     6         self.sex = sex
     7     }
     8     
     9     convenience init(name:String){
    10         self.init(name:name,sex:"男")
    11     }
    12 }
    13 
    14 //-----------------------------------------------
    15 class Child4:Parent4{
    16     var age:Int
    17     init(age:Int) {
    18         self.age = age
    19         //super.init(name: "ls")错误示例
    20         super.init(name: "zs",sex:"妖")
    21        
    22     }
    23    convenience init(){
    24     self.init(age:12)
    25     }
    26 }
    27 
    28 let c4 = Child4()
    29 c4.name
    复制代码
  • 相关阅读:
    时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
    Prometheus COMPARISON TO ALTERNATIVES
    认真分析mmap:是什么 为什么 怎么用
    Flume学习之路 (二)Flume的Source类型
    Flume学习之路 (一)Flume的基础介绍
    Spark学习之路 (二十一)SparkSQL的开窗函数和DataSet
    Spark学习之路 (二十)SparkSQL的元数据
    CentOS 7的安装
    Spark学习之路 (十九)SparkSQL的自定义函数UDF
    Spark学习之路 (十八)SparkSQL简单使用
  • 原文地址:https://www.cnblogs.com/zhangyingai/p/7098973.html
Copyright © 2020-2023  润新知