zoukankan      html  css  js  c++  java
  • Swift -- 7.6 构造器

    构造器用于完成实例的构造过程,这个过程包括为实例中的每个存储属性设置初始值和执行必要的准备和初始化任务

    oc的构造器不同,swift的构造器构造出来的实例由系统隐式返回,无须显式声明返回值类型,也无须使用return返回实例,也不允许使用func关键字

    构造器的主要作用就是完成实例中每个类,结构体中实例存储属性的初始化

     

    为实例存储属性赋初始值有两个时机:

    定义实例存储属性时指定初始值

    在构造器中为实例存储属性指定初始值

     

    /*
    在结构体中
    假设存在有实例存储属性
    如果没有给属性直接赋值,则需要在构造器中赋值,如果没有自己写构造器,可以使用系统提供的给所有属性赋值的构造器
    如果已经给属性直接赋值,可以使用系统提供的无参构造器
    另外,一旦自己写了构造器,那个系统的给所有属性赋值的构造器就不能用了
    */
    struct FkPoint {
        var left : Int
        var top : Int = 0
        init(left: Int)//构造器中的参数全都有默认外部参数名,如果不想要外部参数名可以使用下划线代替
        {
            self.left = left
        }
    }
    var p12 = FkPoint(left: 20)
        
    /*
    使用闭包或函数为属性设置初始值
    如果某个存储属性的默认值需要特别的计算或定制,此时程序可通过闭包或全局函数(不能通过调用实例方法)为该属性指定初始值
    */
    struct ClosureInit {
        var test : Int = {
            return 3;
        }()//这里的括号不能省,不然就是把闭包赋值给test属性
    }
    var ci = ClosureInit()
    print(ci.test)
    //使用闭包或函数对存储属性赋初始值时,不能在闭包中访问该结构体或类的其他实例存储属性(即使它们有初始值),不能使用self,也不能调用其他实例方法--这是因为闭包本身会在构造阶段执行,此时该实例的其他部分还未完成初始化
    
    /*
    值类型的构造器重载
    形参个数不同,或形参类型不同,或外部形参名不同都算是构造器重载
    可以在构造器中使用self调用另一个构造器
    */
    struct Apple {
        var name:String
        var color:String
        var weight:Double!//这里的double类型是可选类型,所以可以不在构造器中赋值
        init(_ name:String, _ color:String)
        {
            self.name = name
            self.color = color
        }
        init(name:String, color:String){
            self.init(name,color)
        }
        init(appleName n:String, appleColor c:String){
    //        name = ""   这里不可以这样写,必须用self来调用
            self.init(n,c)
        }
        init(name:String, color:String, weight:Double){
            self.init(name,color)
            self.weight = weight;
        }
    }
    
    
    
    /*
    可能失败的构造器
    使用init?或init!来声明可能失败的构造器,可以返回nil
    */
    struct Cat {
        let name : String
        init?(name:String){
            if name.isEmpty{
                return nil
            }
            self.name = name
        }
    }
    let c1 = Cat(name: "kitty")
    if c1 != nil{
        print(c1!.name)
    }
    let c2 = Cat(name: "")
    print(c2 == nil)
    
    enum Season2{
        case Spring, Summer, Autumn, Winter
        init!(name:Character){
            switch name{
                case "S","s":
                self = .Spring
                case "U","u":
                self = .Summer
                case "W","w":
                self = .Winter
            default:
                return nil
            }
        }
    }
    let s1 = Season2(name: "s");
    if s1 != nil{
        print("season succees")
    }
    let s2 = Season2(name: "x")
    print(s2 == nil)
    

      

  • 相关阅读:
    day7_subprocess模块和面向对象,反射
    python学习之day6,常用标准模块
    python学习之day5,装饰器,生成器,迭代器,json,pickle
    python学习笔记2(pycharm、数据类型)
    Python 学习笔记1
    Python 学习之进制与编码
    网络协议
    Python学习之Python简介
    计算机发展历史
    Java接口
  • 原文地址:https://www.cnblogs.com/chebaodaren/p/5591094.html
Copyright © 2011-2022 走看看