成员初始化器与自定义初始化器
了解自动生成的成员初始化器,并学习编写自定义初始化器。
成员初始化器与自定义初始化器 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
Swift 结构体会自动获得一个成员初始化器,用于接收所有存储属性。不过,您也可以使用自定义的初始化器逻辑对其进行定制或扩展。
自动生成的成员初始化器
```swift
struct Point {
var x: Double
var y: Double
}
let p = Point(x: 3.0, y: 4.0) // auto-generated init
```
无需自行编写 `init`——编译器会提供一个。
添加自定义初始化器
```swift
struct Circle {
var radius: Double
var area: Double
init(radius: Double) {
self.radius = radius
self.area = .pi * radius * radius
}
}
let c = Circle(radius: 5.0)
```
保留成员初始化器
定义自定义初始化器会抑制自动生成的成员初始化器。要同时保留两者,请将自定义初始化器放在扩展中:
```swift
struct Rect { var width: Double; var height: Double }
extension Rect {
init(square side: Double) { self.init(width: side, height: side) }
}
// Both Rect(width:height:) and Rect(square:) available
```
属性默认值
```swift
struct Config {
var debug = false
var maxRetries = 3
var timeout: TimeInterval = 30
}
let c1 = Config() // all defaults
let c2 = Config(debug: true) // memberwise with overrides
```
使用 self.init 进行初始化器委托
```swift
struct Temperature {
var celsius: Double
init(celsius: Double) { self.celsius = celsius }
init(fahrenheit: Double) { self.init(celsius: (fahrenheit - 32) / 1.8) }
init(kelvin: Double) { self.init(celsius: kelvin - 273.15) }
}
```
可失败初始化器
```swift
struct Percentage {
let value: Double
init?(_ value: Double) {
guard (0...100).contains(value) else { return nil }
self.value = value
}
}
let p = Percentage(105) // nil
```
带验证的初始化
```swift
struct Username {
let value: String
init?(_ raw: String) {
let trimmed = raw.trimmingCharacters(in: .whitespaces)
guard trimmed.count >= 3 else { return nil }
self.value = trimmed
}
}
```
结构体初始化器与类初始化器
与类初始化器的主要区别:
• 结构体可以使用 `self.init()` 进行委托
• 结构体不会继承初始化器(没有 `super.init()`)
• 所有存储属性必须先完成初始化才能使用
• 没有 `required` 或 `designated` / `convenience` 关键字
`init(from decoder:)` 预览
遵循 `Decodable` 的结构体会自动获得初始化器:
```swift
struct User: Decodable {
let name: String
let age: Int
}
// Auto-synthesised init(from:) for JSON decoding
let user = try JSONDecoder().decode(User.self, from: json)
```
快速检查
应将自定义初始化器放在哪里,才能保留自动生成的成员初始化器?
总结
主要要点:
• 编译器会为结构体免费生成成员初始化器
• 在结构体主体中定义自定义初始化器会抑制成员初始化器
• 将自定义初始化器放在扩展中即可同时保留两者
• 使用 `self.init()` 在初始化器之间进行委托
• 可失败初始化器会在输入无效时返回 `nil`
接下来:存储属性和属性观察器。
常见问题解答
「成员初始化器与自定义初始化器」课时是免费的吗?
是的 — 「成员初始化器与自定义初始化器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「成员初始化器与自定义初始化器」这节课中我会学到什么?
了解自动生成的成员初始化器,并学习编写自定义初始化器。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「成员初始化器与自定义初始化器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 成员初始化器与自定义初始化器
- 存储属性与属性观察器
- 结构体中的计算属性
- 可变方法与写时复制语义