zoukankan      html  css  js  c++  java
  • 构造器相关

    import UIKit
    
    // 值类型的构造器重载
    struct ConstructorOverload
    {
        var name: String!
        var amount: Int!
        // 提供无参数的构造器
        init(){ }
        // 提供带两个参数的构造器来完成构造过程
        init(name: String, amount: Int)
        {
            self.name = name
            self.amount = amount
        }
    }
    // 通过无参数构造器创建ConstructorOverload实例
    var oc1 = ConstructorOverload()
    // 通过有参数构造器创建ConstructorOverload实例
    var oc2 = ConstructorOverload(
        name:"HelloWorld",amount:800000)
    print("(oc1.name)  (oc1.amount)")
    print("(oc2.name)  (oc2.amount)")
    
    
    /*
    构造器代理(貌似只支持值类型, 下面解释来自网络):
    值类型(结构体和枚举类型)不支持继承,所以构造器代理的过程相对简单,
    因为它们只能代理任务给本身提供的其它构造器。类则不同,它可以继承自其它类(请参考继承),
    这意味着类有责任保证其所有继承的存储型属性在构造时也能正确的初始化。
    在定义构造器时,通过self.init(实参)调用其他构造器来完成实例的部分构造过程
    */
    struct Apple
    {
        var name: String
        var color: String
        var weight: 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.init(n , c)  // 构造器代理
            // 调用构造器代理之后,即可通过self访问该实例的属性
            print("--执行显式指定外部形参名的构造器--(self.name)")
        }
        
        // 定义三个参数的构造器
        init(name: String , color: String , weight: Double)
        {
            self.init(name , color)  // 构造器代理
            self.weight = weight
        }
    }
    var ap1 = Apple("红富士" , "粉红色")
    print("(ap1.name)--->(ap1.color)")
    var ap2 = Apple(appleName:"青苹果" , appleColor:"绿色")
    print("(ap2.name)--->(ap2.color)")
    var ap3 = Apple(name:"美国苹果" , color:"红色" , weight:0.45)
    
    
    /* 可能失败的构造器 */
    // !号和?号的区别在于, !号修饰的构造器, 在使用被创建出来的对象的时候, 不用再加!解包
    class Cat
    {
        let name: String
        
        init?(name: String)
        {
            self.name = name
            // 如果传入的name参数为空字符串,构造器失败,返回nil
            if name.isEmpty {
                return nil
            }
        }
    }
    let c1 = Cat(name: "Kitty")
    if c1 != nil {
        // 创建c1的构造器是init?,因此程序必须对c1执行强制解析
        print("c1的name为:(c1!.name)")
    }
    let c2 = Cat(name: "")
    print(c2 == nil) // 输出true,表明c2为nil
    
    
    enum Season{
        case Spring, Summer, Autumn, Winter
        // 使用init!定义可能失败的构造器,则该构造器创建的实例可进行隐式解析
        init!(name: Character) {
            // 根据传入的构造器参数选择相应的枚举成员
            switch name {
            case "S","s":
                self = .Spring
            case "U", "u":
                self = .Summer
            case "A", "a":
                self = .Autumn
            case "W", "w":
                self = .Winter
                // 如果传入其他参数,构造失败,返回nil。
            default:
                return nil
            }
        }
    }
    let s1 = Season(name: "s")
    if s1 != nil {
        print("Season实例构造成功!")
    }
    let s2 = Season(name: "x")
    print(s2 == nil)
    
    class Person
    {
        var name: String
        
        init!(name: String)
        {
            self.name = name
            
            if name != "Rinpe" {
                return nil
            }
        }
    }
    
    var p = Person(name: "Lili")
    var p2 = Person(name: "Rinpe")
    
    /*
    1.Swift只为类提供一个无参数的构造器。
    2.Swift为结构体提供两个构造器:无参数的构造器和初始化所有实例存储属性的构造器。
    */
    
  • 相关阅读:
    Introduces the basic structure of Android ActivityManagerService
    创业的本质是资源整合
    android系统的经典文章
    GUI软件框架--窗口服务器
    学习法则:只接收能够体系化的知识
    编程思想:以什么样的方式来建模、分析、思考、解决问题
    怎么从本质上理解面向对象的编程思想?
    视图的对象化描述
    DOM= Document Object Model,文档对象模型---以对象管理组织(OMG)的规约为基础的
    GUI(UI编程)语言与面向对象、dsl
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5183368.html
Copyright © 2011-2022 走看看