尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Swift 结构体:从入门到实战
1. 引言在 Swift 中结构体Struct是构建数据模型和高性能代码的核心工具。与类不同结构体是值类型这意味着它在赋值和传递时会被复制从而避免共享状态带来的复杂性。本文将带你深入理解 Swift 结构体的定义、初始化、属性、方法、扩展及其与类的对比并通过丰富的代码实例帮助你快速掌握。2. 结构体的基本定义使用struct关键字即可定义一个结构体内部可以声明存储属性struct Point { var x: Double var y: Double } let origin Point(x: 0, y: 0) print(origin.x) // 0.0结构体会自动获得一个“成员逐一初始化器”Memberwise Initializer可以按属性名传入初始值。3. 初始化方法虽然默认的成员初始化器很方便但很多时候我们需要自定义初始化逻辑。struct Rectangle { var width: Double var height: Double // 自定义初始化器 init(squareSide side: Double) { width side height side } } let square Rectangle(squareSide: 10) // square.width 和 square.height 都是 10还可以添加可失败初始化器或带默认值的属性struct Car { var brand: String var year: Int init?(brand: String, year: Int) { guard !brand.isEmpty, year 1885 else { return nil } self.brand brand self.year year } }4. 结构体是值类型结构体赋值或传递给函数时会进行深拷贝。修改一个变量不会影响另一个struct Point { var x 0, y 0 } var p1 Point(x: 1, y: 2) var p2 p1 // 拷贝 p2.x 10 print(p1.x) // 1 print(p2.x) // 10而类是引用类型共享同一实例。这是结构体和类最本质的区别也是 Swift 推荐优先使用结构体的原因之一。5. 属性和方法5.1 存储属性与计算属性结构体可以拥有存储属性和计算属性计算属性不直接存储值而是通过 get/set 提供struct Circle { var radius: Double var diameter: Double { get { return radius * 2 } set { radius newValue / 2 } } }5.2 属性观察器可以为存储属性添加willSet和didSetstruct StepCounter { var totalSteps: Int 0 { willSet { print(将步数设置为 \(newValue)) } didSet { if totalSteps oldValue { print(增加了 \(totalSteps - oldValue) 步) } } } }5.3 方法结构体内部可以定义实例方法和类型方法struct Vector2D { var x 0.0, y 0.0 func length() - Double { return sqrt(x * x y * y) } static func unitX() - Vector2D { return Vector2D(x: 1, y: 0) } }5.4 mutating 方法默认情况下结构体实例方法不能修改实例的属性。如果需要修改必须在方法前添加mutating关键字struct Point { var x 0.0, y 0.0 mutating func moveBy(dx: Double, dy: Double) { x dx y dy } } var point Point(x: 1, y: 1) point.moveBy(dx: 2, dy: 3) // 现在 point 的坐标为 (3, 4)6. 下标结构体可以定义下标subscript方便通过索引访问内部数据struct TimesTable { let multiplier: Int subscript(index: Int) - Int { return multiplier * index } } let threeTimesTable TimesTable(multiplier: 3) print(threeTimesTable[6]) // 187. 嵌套类型结构体内部可以嵌套枚举、结构体或类形成更清晰的层级结构struct ChessBoard { enum Piece { case king, queen, rook, bishop, knight, pawn } struct Square { var row: Int var column: Int var piece: Piece? } var squares: [[Square]] [] }8. 结构体的扩展通过扩展Extension可以为已有结构体添加新功能甚至可以扩展 Swift 标准库中的结构体extension Point { // 添加计算属性 var isOrigin: Bool { return x 0 y 0 } // 添加方法 func distance(to other: Point) - Double { let dx x - other.x let dy y - other.y return sqrt(dx * dx dy * dy) } }9. 遵循协议结构体可以遵循一个或多个协议例如Equatable、Hashable、Codable从而获得相等性比较、哈希、编解码等能力struct Person: Codable, Equatable { var name: String var age: Int } let alice Person(name: Alice, age: 30) let encoder JSONEncoder() let data try encoder.encode(alice)10. 结构体与类的对比总结特性结构体类类型值类型引用类型继承不支持支持类型转换不支持支持is/as?析构函数无有deinit引用计数无有 ARC可变性实例常量不可变方法需mutating实例常量可修改属性使用建议优先用于数据模型、数值类型等需要继承或共享状态时使用11. 实战示例构建用户信息模型下面演示如何用结构体构建一个用户管理系统的数据模型并结合计算属性和 Codable 协议进行数据持久化struct Address: Codable { var street: String var city: String var zipCode: String } struct User: Codable, Equatable { var id: Int var name: String var email: String var address: Address var displayName: String { return \(name) (#\(id)) } static func loadFromDisk() throws - [User] { let url FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] .appendingPathComponent(users.json) let data try Data(contentsOf: url) return try JSONDecoder().decode([User].self, from: data) } }这个模型可以直接用于 JSON 解析和本地存储充分体现了结构体在 Swift 开发中的便利性。12. 结语Swift 结构体是构建安全、高效代码的基石。理解其值语义、初始化器、属性和方法、扩展以及与协议的配合能帮助你写出更健壮的 iOS 或服务端 Swift 程序。希望本文的代码实例能为你提供实用的参考。
RELATED

相关推荐

VS Code代码高亮配置与优化全指南

VS Code代码高亮配置与优化全指南

1. 为什么代码高亮对开发者如此重要 第一次打开一个没有语法高亮的代码文件时,那种扑面而来的压迫感至今难忘——密密麻麻的纯文本像一堵密不透风的墙,关键语法结构全部淹没在单调的字符海洋中。这就是为什么现代IDE都将代码高亮作为基础功能&#xff0c…

📅 2026/10/11 15:50:15
XSLT-if详解:条件判断的语法与实战

XSLT-if详解:条件判断的语法与实战

1. 引言XSLT&#xff08;可扩展样式表语言转换&#xff09;是处理 XML 文档的强大工具&#xff0c;而 <xsl:if> 是其中最常用的条件判断指令之一。它允许我们在转换过程中根据节点内容、属性值或表达式结果&#xff0c;有选择地输出内容。本文将通过丰富的代码实例&#…

📅 2026/10/2 5:00:03
Java实现ReAct智能体:AgentScope框架下的工程实践与架构设计

Java实现ReAct智能体:AgentScope框架下的工程实践与架构设计

1. 项目概述&#xff1a;当Java遇上AgentScope的ReAct智能体最近在智能体开发领域&#xff0c;AgentScope这个框架的热度是越来越高了。作为一个专注于多智能体应用开发的平台&#xff0c;它让构建复杂的协作式AI应用变得前所未有的简单。而今天我想和大家深入聊聊的&#xff0…

📅 2026/10/9 0:13:35
MORE NEWS

更多资讯

📰

MBD三维模型智能标注落地指南:从PMI语义到规则引擎

简介&#xff1a;一份面向制造业设计、工艺与检验人员的PDF技术资料&#xff0c;围绕基于MBD的三维模型智能标注技术展开&#xff0c;针对传统二维工程图在信息传递中易遗漏数据、影响设计意图理解等痛点&#xff0c;给出以三维实体模型为核心承载完整制造信息的解决思路。资源…

📰

YOLOv5打电话行为检测:从数据集训练到PyQt界面部署全流程

简介&#xff1a;本资源面向计算机视觉入门与进阶开发者&#xff0c;提供一套完整的YOLOv5打电话行为检测方案&#xff0c;可用于课堂演示、安防场景原型验证或毕业设计参考。包内包含训练好的打电话识别权重与配套数据集&#xff0c;标注同时提供txt和xml两种格式并分目录存放…

📰

3ds Max+Vray系统设置指南:单位、Gamma与备份一个都不能少

简介&#xff1a;这是一套面向环境艺术与三维设计初学者的培训课程幻灯片&#xff0c;聚焦软件概述与系统设置&#xff0c;从界面四视图、主工具栏到几何体与样条线的创建方法均有清晰讲解。资源共1个PPT文件&#xff0c;压缩包约8.29MB&#xff0c;便于直接演示或自学。内容涵…

📰

Flutter持久化库鸿蒙化适配实践:从桥接层到自动化验证

一个深夜&#xff0c;某天我在翻 issue 列表时看到一个很熟悉的仓库名——bot_storage&#xff0c;它是我之前在一套 Bot 框架里反复用到的 Flutter 持久化层。老实说接到“鸿蒙化适配”这个安排的时候&#xff0c;我心里是有点打鼓的。毕竟 Flutter 社区里关于鸿蒙的适配资料&…

📰

AutoCAD 2021入门教程:单位设置、图层管理与精确绘图全攻略

简介&#xff1a;AutoCAD 2021中文版超实用超详教程以单份PDF文档呈现&#xff0c;面向零基础到进阶的CAD学习者、机械与建筑方向设计人员&#xff0c;帮助读者快速掌握软件界面操作与二维绘图技能。教程第一章从AutoCAD的基本功能讲起&#xff0c;逐一解析菜单栏、工具栏、绘图…

📰

CAD多重插入引用炸不开?转换普通块彻底解决MINSERT

简介&#xff1a;针对CAD多重插入引用加密图纸无法直接炸开编辑的常见问题&#xff0c;这份技术文档给出了从菜单操作、命令行到AutoLISP编程的完整解决思路。内容面向经常处理加密CAD图纸的设计人员、制图员&#xff0c;以及希望掌握CAD自动化批处理技能的进阶用户&#xff0c…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬