Swift 构造过程
封面图
•
2025-10-23
•
Swift
1
0
0
0
在 **Swift** 中,**构造过程(Initialization)** 是用于创建和初始化对象的过程。构造函数被称为 **initializer**,它负责为类、结构体或枚举的实例分配内存并设置初始状态。 --- ## 一、基本概念 ### 1. 构造器(Initializer) - Swift 使用 `init()` 来定义构造器。 - 构造器没有返回值,也不需要使用 `return` 关键字。 ```swift struct Person { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } } ``` --- ## 二、构造器类型 ### 1. **默认构造器(Default Initializer)** - 如果类或结构体没有定义任何构造器,Swift 会自动提供一个默认构造器。 - 默认构造器会将所有属性初始化为默认值(如 `0`、`""`、`false` 等)。 ```swift struct Point { var x: Int var y: Int } let p = Point() // 默认构造器:x=0, y=0 ``` > 注意:如果属性没有默认值,或者有自定义的构造器,则不会自动提供默认构造器。 --- ### 2. **成员构造器(Memberwise Initializer)** - 对于结构体(`struct`)和枚举(`enum`),Swift 会自动生成一个“成员构造器”(memberwise initializer),可以按属性名传入参数。 ```swift struct User { var username: String var age: Int } let user = User(username: "Alice", age: 25) ``` > 类(`class`)不会自动生成成员构造器。 --- ### 3. **指定构造器(Designated Initializer)** - 每个类必须有一个指定构造器,用于完全初始化该类的所有属性。 - 指定构造器是类的主要构造器。 ```swift class Car { var model: String var year: Int init(model: String, year: Int) { self.model = model self.year = year } } ``` --- ### 4. **便利构造器(Convenience Initializer)** - 便利构造器是辅助构造器,通常用来调用指定构造器,以简化初始化过程。 - 用 `convenience` 关键字声明。 - 必须调用同一个类中的其他构造器(可以是指定或另一个便利构造器)。 ```swift class Car { var model: String var year: Int init(model: String, year: Int) { self.model = model self.year = year } convenience init(model: String) { self.init(model: model, year: 2024) } } ``` --- ## 三、构造器的继承与重写(Class) ### 1. **构造器继承** - 子类**不会自动继承父类的构造器**,除非满足某些条件。 - 如果子类没有定义任何构造器,那么它会继承父类的构造器(如果父类的构造器可以被安全地调用)。 ### 2. **构造器重写(Override)** - 在子类中,不能直接重写构造器,但可以通过调用父类的构造器来实现类似功能。 ```swift class Vehicle { var wheels: Int init(wheels: Int) { self.wheels = wheels } } class Bike: Vehicle { var hasBasket: Bool init(hasBasket: Bool) { self.hasBasket = hasBasket super.init(wheels: 2) } } ``` --- ## 四、可失败构造器(Failable Initializer) - 当构造过程中可能失败时,可以使用 `init?()` 或 `init!()`。 ```swift struct Temperature { var celsius: Double init?(celsius: Double) { if celsius < -273.15 { return nil // 负温度不可能 } self.celsius = celsius } } if let temp = Temperature(celsius: -300) { print("Valid temperature") } else { print("Invalid temperature") } ``` --- ## 五、必要构造器(Required Initializer) - 在类中使用 `required` 关键字,表示所有子类都必须实现这个构造器。 ```swift class Animal { required init() { // 初始化代码 } } class Dog: Animal { override init() { super.init() } } ``` --- ## 六、延迟构造(Lazy Initialization) - 可以使用 `lazy` 关键字来延迟初始化属性,直到第一次访问时才进行初始化。 ```swift class DataProvider { lazy var data: [String] = { return ["A", "B", "C"] }() } ``` --- ## 七、构造器链(Initialization Chain) - 构造器之间可以通过 `self.init(...)` 进行调用。 - 指定构造器可以调用另一个指定构造器,也可以调用便利构造器。 - 便利构造器只能调用同一类中的其他构造器。 ```swift class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(size: Double) { self.init(width: size, height: size) } } ``` --- ## 总结 | 构造器类型 | 说明 | |--------------------|-------------------------------------------| | `init()` | 指定构造器 | | `convenience init()` | 便利构造器 | | `init?()` | 可失败构造器 | | `init!()` | 强制可失败构造器 | | `required init()` | 必要构造器(用于类继承) | 如果你对某个具体场景(比如类的继承、可选构造器等)有疑问,欢迎继续提问!
上一篇:
Swift 继承
下一篇:
Swift 可选链
标题录入,一次不能超过6条
返回顶部
留言
留言
评论