构造器相关

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为结构体提供两个构造器:无参数的构造器和初始化所有实例存储属性的构造器。
*/
原文地址:https://www.cnblogs.com/Rinpe/p/5183368.html