Swift 里构造过程

目录

构造过程(实体的初始化等生命周期?)

存储属性的初始赋值(struct,enumerte)

构造器

默认属性值 (在属性声明时为其设置默认值,比构造器里设置好)

自定义构造过程 (自定义init初始化方法)

形参的构造过程 (形参:函数内部调用的参数)

形参命名和实参标签(实参标签:函数外部调用使用的参数名)

不带实参标签的构造器形参 (使用 "_ " 来表示忽略实参)

可选属性类型 (只声明,不在构造器init里赋值)

构造过程中常量属性的赋值(init里可以给常量赋值,init结束后不可变更)

默认构造器 (所有属性都在初始化时设置默认值的行为?Class() )

结构体的逐一成员构造器

值类型的构造器代理 (自定义后无法访问默认构造器)

类的继承和构造过程

指定构造器和便利构造器 (每个类必须至少拥有一个指定构造器)

指定构造器(init() ) 和便利构造器 (convenience init() ) 的语法

类类型的构造器代理

三条规则:

两段式构造过程

安全检查 

构造器的继承和重写

构造器的自动继承

自动继承的2 个规则

指定构造器和便利构造器实践

可失败构造器  init?

枚举类型的可失败构造器

带原始值的枚举类型的可失败构造器

构造失败的传递

重写一个可失败构造器

init! 可失败构造器 (不可失败的更合理?)

必要构造器(构造器前添加 required 该类的子类都必须实现)

通过闭包或函数设置属性的默认值 

总结:


构造过程(实体的初始化等生命周期?)

构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前有个过程是必须的,它包括设置实例中每个存储属性的初始值和执行其他必须的设置或构造过程。

存储属性的初始赋值(struct,enumerte)

类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态

可以在构造器中为存储型属性设置初始值,也可以在定义属性时分配默认值。存储型属性分配默认值或者在构造器中为设置初始值时,它们的值是被直接设置的,不会触发任何属性观察者。

构造器

构造器在创建某个特定类型的新实例时被调用。它的最简形式类似于一个不带任何形参的实例方法,以关键字 init 命名:(示例 在构造器中为存储型属性设置初始值)

struct Fahrenheit {
    var temperature: Double
    init() {
        temperature = 32.0 //执行构造过程
    }
}
var f = Fahrenheit()
print("The default temperature is \(f.temperature)° Fahrenheit")
// 打印“The default temperature is 32.0° Fahrenheit”

默认属性值 (在属性声明时为其设置默认值,比构造器里设置好)

使用默认值让属性的初始化和声明结合得更紧密。它能让你的构造器更简洁、更清晰,且能通过默认值自动推导出属性的类型;同时,它也能让你充分利用默认构造器、构造器继承等特性

自定义构造过程 (自定义init初始化方法)

形参的构造过程 (形参:函数内部调用的参数)

自定义构造过程时,可以在定义中提供构造形参,指定其值的类型和名字。构造形参的功能和语法跟函数和方法的形参相同

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}

调用,并没有显形的去调用init
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius 是 100.0

let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius 是 0.0

形参命名和实参标签(实参标签:函数外部调用使用的参数名)

跟函数和方法形参相同,构造形参可以同时使用在构造器里使用的形参命名和一个外部调用构造器时使用的实参标签。

构造器并不像函数和方法那样在括号前有一个可辨别的方法名。因此在调用构造器时,主要通过构造器中形参命名和类型来确定应该被调用的构造器。正因如此,如果你在定义构造器时没有提供实参标签,Swift 会为构造器的每个形参自动生成一个实参标签。

struct Color {
    let red, green, blue: Double

自定义构造器方法一。形参和实参相同
    init(red: Double, green: Double, blue: Double) {
        self.red   = red
        self.green = green
        self.blue  = blue
    }

自定义构造器方法二
    init(white: Double) {
        red   = white
        green = white
        blue  = white
    }
}


构造方法的使用
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)

let halfGray = Color(white: 0.5)


错误使用
let veryGreen = Color(0.0, 1.0, 0.0)
// 报编译期错误-需要实参标签

不带实参标签的构造器形参 (使用 "_ " 来表示忽略实参)

如果你不希望构造器的某个形参使用实参标签,可以使用下划线(_)来代替显式的实参标签来重写默认行为。(同函数呀)

struct Celsius {
 init(_ celsius: Double){
        temperatureInCelsius = celsius
    }
}


调用也是没有显性调用 init
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius 为 37.0

可选属性类型 (只声明,不在构造器init里赋值)

有一个逻辑上允许值为空的存储型属性——无论是因为它无法在初始化时赋值,还是因为它在之后某个时机可以赋值为空——都需要将它声明为 可选类型。可选类型的属性将自动初始化为 nil,表示这个属性是特意在构造过程设置为空。

class SurveyQuestion {
    var text: String
    var response: String?  可选型。自动赋值为 nil,表明“暂时还没有字符“
    init(text: String) {
        self.text = text
    }
    func ask() {
        print(text)
    }
}

let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// 打印“Do you like cheese?”
cheeseQuestion.response = "Yes, I do like cheese."

构造过程中常量属性的赋值(init里可以给常量赋值,init结束后不可变更)

可以在构造过程中的任意时间点给常量属性赋值,只要在构造过程结束时它设置成确定的值。一旦常量属性被赋值,它将永远不可更改

class SurveyQuestion {
    let text: String
    var response: String?

    init(text: String) { 构造器里可以给常量赋值,赋完后不可更改
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// 打印“How about beets?”
beetsQuestion.response = "I also like beets. (But not with cheese.)"

默认构造器 (所有属性都在初始化时设置默认值的行为?Class() )

如果结构体或类为所有属性提供了默认值,又没有提供任何自定义的构造器,那么 Swift 会给这些结构体或类提供一个默认构造器。这个默认构造器将简单地创建一个所有属性值都设置为它们默认值的实例。

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()

结构体的逐一成员构造器

逐一成员构造器是用来初始化结构体新实例里成员属性的快捷方法。新实例的属性初始值可以通过名字传入逐一成员构造器中。


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值