美文网首页
构造方法总结一

构造方法总结一

作者: 来金德瑞 | 来源:发表于2017-08-30 18:58 被阅读10次

作用:对实例对象的内容进行初始化
Swift要求类或者结构体中的存储属性(非lazy的)在对象构造完毕后要有初始化值

语法:
init(参数列表){
    初始化代码
}

注意:

  1. Swift中类/结构体/枚举都需要构造方法
  2. 构造方法的作用仅仅是用于初始化属性,而不是分配内容,分配内存是系统帮我们做的
  3. 构造方法是隐式调用的,通过 类名称()形式创建一个对象就会隐式调用init()构造方法
  4. 如果所有的存储属性都有默认值,可以不提供构造方法,系统会提供一个隐式的构造方法
  5. 如果存储属性可以提供缺省值,那么提倡大家使用设置缺省值的方式,这样可以简化代码(不用自定义狗仔方法,不用写存储属性类型)

不带参数的构造方法

class Person{
    var name : String = "zx"
    var age : Int
    func description() -> String {
        return "name = \(name) age = \(age)"
    }
    init() {
        print("init")
        age = 3
    }
}

/*
 1.分配内存
 2.初始化name和age
 3.构造方法是隐式调用的
 */
var p = Person()
p.description()//显示调用

带参数的构造方法


class Person2{
    var name:String
    var age:Int
    func description() ->String{
        return "name = \(name) age = \(age)"
    }

    /*
     构造方法的内部参数,默认也是外部参数
     构造方法对属性的顺序没有要求,只要保证对象构造完成时所有存储属性被初始化即可
     */
    init(age:Int, name:String)
    {
        self.age = age
        self.name = name
    }

}
//var p2 = Person2(name: "zx", age: 30)
var p3 = Person2(age: 30, name: "zx")

可选属性与构造方法

class Car{
    let name: String
    init(name:String) {
        self.name = name
    }
}

class Person3{
    let name : String
    var age : Int
    var car : Car?
    
    /*
      可选值存储属性可以不再构造方法中初始化,
      也就是说可选值在对象构造完毕后不用初始化
      其实如果不对可选存储属性进行初始化, 默认就是nil
    */
    init(age:Int,name:String) {
        self.age = age
        self.name = name
    }
    
    func description() ->String{
        return "name = \(name) age = \(age)"
    }
    
}

结构体构造方法

struct Rect{
    
    var width : Double = 0.0
    var height : Double = 0.0
    
    //系统默认会提供一个类似的方法
    /*
    init(width:Double,height:Double) {
        self.width = width
        self.height = height
    }
    
    init() {
        self.width = 0.0
        self.height = 0.0
    }
    */
    
}
var r = Rect()
//var r = Rect(width: 1.0, heigth: 1.0)

/*
 注意: 
 1.在类中默认是没有逐一构造器的
 2.如果在结构体中自定义了构造方法, 那么系统不会生成默认的逐一构造器
 3.如果给存储属性提供了缺省值, 系统还是会提供默认的逐一构造器
   var r = Rect(width: 1.0, heigth: 1.0)
 4.如果给存储属性提供了缺省值, 可以使用不带参数的方法初始化结构体
 */

"值类型"的构造器代理


/*
 构造器代理: 构造方法之间的相互调用
 构造方法可以调用其他构造方法来完成实例的构造, 称之为构造器代理
 好处: 减少构造方法之间的重复代码
 */
struct Rect2 {
    var width:Double
    var height:Double
    
    init(width:Double, height:Double)
    {
        self.width = width
        self.height = height
    }
    
    
    init()
    {
        //        self.width = 0
        //        self.height = 0
        // 构造器代理
        self.init(width:0, height:0)
    }
    func show(){
        print("width = \(width) height = \(height)")
    }
}
var r2 = Rect2()
r2.show()
var r3 = Rect2(width: 100, height: 100)
r3.show()

通过闭包或者全局函数/类方法 设置存储属性的缺省值



func getTel() ->Int{
    print("getTel")
    return 11111111111
}
class Person4{
    var name : String
    //系统在初始化的时候回隐式执行闭包,将闭包的执行结果赋值给存储属性
    var age : Int = {
        print("age 闭包")
        return 30
    }()
    lazy var height:Double = {
        print("lazy 闭包")
        return 180.0
    }()
    
    
    class func getAddress() -> String{
        print("class getAddress")
        return "北京"
    }
    
    func getNickName() -> String
    {
        return "小明"
    }
    
    var tel = getTel()
    var address = Person4.getAddress()
    /*
     不能这样写, 因为调用方法时对象还没有初始化完毕
     self只有当所有的存储属性都初始化完毕之后才可以用
     var nickName = self.getNickName
    */
    
    init(name:String)
    {
        print("init")
        self.name = name
    }
}


var p5 = Person4(name: "zx")
// 懒加载是用到时才执行, 而闭包赋值是初始化时就会执行
print(p5.height)
/*
 执行结果:
 age 闭包
 getTel
 class getAddress
 init
 lazy 闭包
 180.0
 */

相关文章

  • 构造方法总结一

    作用:对实例对象的内容进行初始化Swift要求类或者结构体中的存储属性(非lazy的)在对象构造完毕后要有初始化值...

  • android Path的使用

    参考:android绘图之Path总结Path相关方法讲解(一)path类的简化结构图 内部枚举类 构造方法 构造...

  • 关于构造函数Array属性和方法总结

    @(JavaScript基础) 关于构造函数Array属性和方法总结 构造函数Array属性: Array.len...

  • 构造方法总结二

    构造器间的调用规则 指定构造器必须调用其直接父类的"指定构造器" 便利构造器必须调用同类中的其它构造器(指定或便利...

  • HashMap源码分析

    目录 一、数据模型 二、重要属性 三、构造方法 四、普通方法 put() resize() get() 五、总结 ...

  • Swift 引发的一场知识暴动

    一、构造方法 在Swift中,主要有三种构造方法:系统构造方法、普通构造方法与便利构造方法。构造方法一般都是以 i...

  • 原型和原型链

    大纲 对象是怎么产生的 什么是原型 什么是原型链 总结: 每一个构造方法都对应一个原型 访问原型的方法:构造函数....

  • 【个人】系统学习-HashMap

    学习HashMap源码 构造方法 获取元素方法 添加元素方法 总结 HashMap只允许一个为null的key。 ...

  • scala:构造方法与apply

    scala中分主构造方法、辅助构造方法,辅助构造方法必须调用主构造方法 构造方法参数作用域 如果父类有主构造方法,...

  • netty源码分析(六) - ByteBuf - 2Unpool

    UnpooledByteBufAllocator 先来分析下DEFAULT,及构造方法 总结一下就是非androi...

网友评论

      本文标题:构造方法总结一

      本文链接:https://www.haomeiwen.com/subject/cxmxjxtx.html