zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/1016882435AIDA/p/6091051.html
Copyright © 2011-2022 走看看