当前位置: 首页 > news >正文

Swift构造过程介绍

Swift 构造过程概述

Swift 的构造过程是实例化类、结构体或枚举时的重要机制。构造过程通过构造器(init)实现,确保实例在首次使用前完成正确的初始化。Swift 的构造器无需返回值,其主要任务是初始化存储属性。

默认构造器

如果结构体或类为所有存储属性提供默认值,且没有自定义构造器,Swift 会自动生成一个默认构造器。

struct Person { var name: String = "Unknown" var age: Int = 0 } let defaultPerson = Person() // 使用默认构造器 print(defaultPerson.name) // 输出: Unknown

自定义构造器

通过定义init方法,可以自定义构造逻辑。构造器可以包含参数,用于在初始化时赋值。

struct Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } } let rect = Rectangle(width: 10.0, height: 5.0) print(rect.width) // 输出: 10.0

构造器代理

值类型(结构体、枚举)可以通过self.init调用其他构造器,实现构造器代理,避免重复代码。

struct Size { var width: Double var height: Double init() { self.init(width: 0.0, height: 0.0) } init(width: Double, height: Double) { self.width = width self.height = height } } let defaultSize = Size() print(defaultSize.width) // 输出: 0.0

类的指定构造器和便利构造器

类的构造过程更复杂,支持指定构造器(init)和便利构造器(convenience init)。指定构造器是类的主要构造器,必须调用父类的指定构造器(如果有父类)。便利构造器是次要构造器,必须最终调用一个指定构造器。

class Vehicle { var numberOfWheels: Int init(wheels: Int) { numberOfWheels = wheels } convenience init() { self.init(wheels: 4) } } let car = Vehicle() print(car.numberOfWheels) // 输出: 4

可失败构造器

通过init?定义可失败构造器,允许初始化失败时返回nil。适用于初始化条件可能不满足的场景。

struct Temperature { var celsius: Double init?(celsius: Double) { if celsius < -273.15 { return nil } self.celsius = celsius } } let validTemp = Temperature(celsius: 25.0) let invalidTemp = Temperature(celsius: -300.0) print(validTemp?.celsius ?? "nil") // 输出: 25.0 print(invalidTemp?.celsius ?? "nil") // 输出: nil

必要构造器

required修饰的构造器表示子类必须实现该构造器,通常用于协议或父类中需要子类强制实现的构造逻辑。

class Animal { var name: String required init(name: String) { self.name = name } } class Dog: Animal { required init(name: String) { super.init(name: name) } } let dog = Dog(name: "Buddy") print(dog.name) // 输出: Buddy

构造过程中的属性观察

在构造过程中,即使属性设置了观察器(willSet/didSet),观察器的代码也不会被执行。属性观察器仅在构造完成后生效。

struct Counter { var count: Int { willSet { print("即将设置 count 为 \(newValue)") } } init(count: Int) { self.count = count // 不会触发 willSet } } var counter = Counter(count: 5) counter.count = 10 // 触发 willSet

闭包或函数设置默认值

存储属性的默认值可以通过闭包或函数动态计算。闭包在属性初始化时被调用,返回的值作为默认值。

struct GameBoard { let boardSize: Int = { return 10 * 10 }() } let board = GameBoard() print(board.boardSize) // 输出: 100

总结

Swift 的构造过程提供了灵活的初始化机制,支持默认构造器、自定义构造器、构造器代理、可失败构造器等特性。类的构造过程进一步区分指定构造器和便利构造器,确保继承链的正确初始化。通过合理使用这些特性,可以编写出安全且高效的初始化逻辑。

http://www.jsqmd.com/news/488979/

相关文章:

  • Swift 函数基础
  • 8元搞定Cursor永久账号:手把手教你用域名邮箱绕过限制(附Spaceship购买教程)
  • 以太网详解(七)TCP/IP四层模型与协议栈实战
  • PDSC文件详解:如何为你的MDK软件包编写完美的XML描述
  • Flux Sea Studio 海景摄影生成工具:Agent智能体架构设计——打造自主规划与迭代的海景创作智能体
  • CH552P低成本测温风扇控制器设计
  • OFA-iic/ofa_visual-entailment_snli-ve_large_en保姆级教程:开箱即用GPU推理全流程
  • JS 实现前端给图片加水印 及 叠加图片
  • Torch-TensorRT 相关
  • Android11系统定制实战:如何彻底禁用下拉状态栏(附完整代码修改)
  • 开源渗透测试项目
  • 图片变视频神器Wan2.2-I2V-A14B体验:480P高清流畅,效果惊艳
  • Phi-4-reasoning-vision-15B应用场景:政务办事截图自动分类与材料完整性校验
  • 避开这些坑!亚太杯数学建模A题灌溉系统布线规划实战指南
  • 百川2-13B-Chat WebUI v1.0 入门必看:输入框支持Markdown语法与代码块自动渲染
  • Linux系列七:linux常用命令二
  • 安卓手机抓包神器VNET实战:5分钟搞定京东wskey提取(附青龙面板自动转换教程)
  • vLLM私有化部署实战:从零构建企业级LLM推理服务
  • 2026年口碑好的倒伏照明灯公司推荐:车载自动倒伏照明灯/应急救援倒伏照明灯/野外勘测倒伏照明灯公司精选 - 品牌宣传支持者
  • 习题2.1 简单计算器
  • 数据取证双雄:Passware Kit Forensic 与 ElcomSoft 密码恢复工具的场景化选型指南
  • 模块化嵌入式时钟系统:多源授时与可插拔硬件架构
  • HY-Motion 1.0快速入门:3步搞定3D动作生成,效果惊艳
  • EcomGPT-7B电商知识图谱:Neo4j图数据库集成方案
  • 习题2.2 数组循环左移
  • Web安全攻防实战01:巧用文件包含漏洞获取flag.php
  • Unity中Animator动画结束监听的3种高效实现方案对比
  • 从零到一:基于Easytier构建去中心化虚拟局域网的实战指南
  • RepeatModeler 2.0.7 安装与使用--生信工具75
  • CV论文Ablation Study表格Latex高效排版技巧