Swift 类、结构体的初始化

本文详细介绍了Swift中的初始化器,包括结构体的默认初始化器、自定义初始化器、成员初始化器以及初始化器委托。通过示例展示了如何为实例分配属性值,并讨论了常量属性在初始化过程中的使用规则。同时,还探讨了值类型如何通过初始化器委托实现不同初始化场景的覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、初始化器

  • 初始化器在创建特定类型的实例时被调用
struct Person {
    var name: String
    init() {  //初始化器
        name = "zhangsan"
    }
}
var p = Person()
print("name is \(p.name)")

2、默认的初始化器

  • Swift 为所有没有提供初始化器的结构体或类提供了一个默认的初始化器来给所有的属性提供 了默认值。这个默认的初始化器只是简单地创建了一个所有属性都有默认值的新实例
//默认的初始化器
class ShopListItem {
    //类中的每个属性都有默认值
    var name: String?
    var quantity = 1
    var purchased = false
}
let item = ShopListItem()
item.name = "lisi"
print("name is \(item.name!), quantity is \(item.quantity), purchased is \(item.purchased)")

3、自定义初始化

  • 可以提供初始化形式参数作为初始化器的一部分,来定义初始化过程中的类型和值的名称。初始化形式参数与函数和方法的形式参数具有相同的功能和语法
//自定义初始化器
struct Number {
    var number: Double
    init(fromSumNumber num: Double) {  //与函数的形式参数具有相同的语法(实际参数标签 + 形式参数)
        number = num + 12.4 + 30.8 + 45.6
    }
    init(fromAverageNumber num: Double) {
        number = (num - 12.4 + 30.8 + 45.6) / 4
    }
}
let number = Number(fromSumNumber: 10.3)
let number2 = Number(fromAverageNumber: 106.0)
print("number is \(number), number2 is \(number2)")

4、在初始化中分配常量属性

  • 在初始化的任意时刻,你都可以给常量属性赋值,只要它在初始化结束时设置了确定的值即可。一旦为常量属性被赋值,它就不能再被修改了
class SurveyQuestion {
    let text: String  //定义了一个常量属性
    var response: String?
    init(text: String) {  //在初始化时为常量属性赋值,这个常量不能再被修改
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let beetQuestion = SurveyQuestion(text: "How about beets?")
beetQuestion.ask()
beetQuestion.response = "I alse like beets.(but not with cheese)"
//beetQuestion.text = "Do you like beets?"   //此时运行报错,不能再修改已经赋值过了的常量属性

5、结构体的成员初始化器

  • 如果结构体类型中没有定义任何自定义初始化器,它会自动获得一个成员初始化器。不同于默认初始化器,结构体会接收成员初始化器即使它的存储属性没有默认值
struct Size {
    var width = 0.0, height = 0.0
}

6、值类型的初始化器委托

  • 初始化器可以调用其他初始化器来执行部分实例的初始化。这个过程,就是所谓的初始化器委托,避免了多个初始化器里冗余代码
struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    init() {}
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    init(center: Point, size: Size) {
        let originX = center.x - (size.width) / 2
        let originY = center.y - (size.height) / 2
        //调用其他初始化器来执行实例的初始化,就叫初始化器委托
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值