Swift 基础语法全景(一):从变量到类型安全

作者:unravel2025日期:2025/10/14

常量与变量:let vs var

  1. 声明语法
1// 常量:一次赋值,终身不变
2let maximumLoginAttempts = 10        // 最大尝试次数,业务上不允许修改
3
4// 变量:可反复写入
5var currentAttempt = 0               // 当前尝试次数,失败+1
6
  1. 延迟赋值

只要「第一次读取前」完成初始化即可,不必一行写完。

1var randomGenerator = SystemRandomNumberGenerator()
2let isDevEnvironment = randomGenerator.next() % 3 == 0
3let timeout: Int
4if isDevEnvironment {
5    timeout = 100                   // 开发环境宽松一点
6} else {
7    timeout = 10                    // 生产环境严格
8}
9// 编译器会检查所有分支都赋值,否则报错
10
  1. 一次声明多个
1let red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF
2var x = 0, y = 0, z = 0
3

命名规则:Unicode 可用,但别作死

✅ 合法

1let π = 3.14159
2let 欢迎 = "Hello"
3let 🐶🐮 = "dogcow"
4

❌ 非法

1let 3x = 1        // 不能以数字开头
2let a-b = 0       // 不能含运算符
3let private = 1   // 虽能编译,但与访问控制关键字冲突,别这么干
4

基本数据类型一览表

类型说明字面量示例备注
Int平台字长42, -732 位平台 == Int32;64 位 == Int64
UInt无符号平台字长42仅当位运算/内存布局时才用
Int8/16/32/64指定位宽127与 C 交互、网络协议、二进制文件
Double64 位浮点3.14159, 1.25e2默认推断类型
Float32 位浮点3.14内存/带宽敏感场景
Bool真/假true, false不能用 0/1 代替
StringUTF-8 文本"Hello"值类型,拷贝即复制(写时优化)

整数字面量“花式写法”

1let decimal = 17
2let binary = 0b10001       // 0b 前缀
3let octal = 0o21           // 0o 前缀
4let hex = 0x11             // 0x 前缀
5
6// 增加可读性
7let oneMillion = 1_000_000
8let rgb = 0xFF_FF_FF_00
9

类型推断与类型注解

  1. 推断
1let meaningOfLife = 42        // 推断为 Int
2let pi = 3.14159              // 推断为 Double(不是 Float)
3
  1. 显式注解
1var message: String = "Hello" // 显式告诉编译器
2// 如果不给初始值,必须写类型
3var score: Int
4score = 100
5
  1. 多变量同类型
1var a, b, c: Double           // 3 个都是 Double
2

数值类型转换——“必须显式”

Swift 没有隐式类型转换,防止溢出 Bug。

1let age: UInt8 = 25
2let weight: UInt16 = 76
3
4// 错误:age + weight          // 类型不一致
5let total = UInt16(age) + weight // ✅ 显式构造
6

浮点与整数互转:

1let x = 3
2let d = Double(x) + 0.14159     // 3.14159
3
4let fraction: Double = 4.75
5let whole = Int(fraction)       // 4,截断(不会四舍五入)
6

类型别名 typealias——给长名字起小名

1typealias Byte = UInt8
2typealias AudioSample = UInt16
3
4let maxAmplitude = AudioSample.min   // 0
5

工程场景:

  • 与 C API 交互时,把 UInt32 起别名叫 CRC32,语义清晰。
  • 以后底层类型换成 UInt64 时,改一行即可,业务层无感知。

Print & 字符串插值

1let name = "Swift"
2print("Hello, \(name)!")     // Hello, Swift!
3
4// 自定义 terminator
5print("Loading...", terminator: "")   // 不换行
6

注释:可嵌套的多行注释

1/* 外层
2   /* 内层 1
3      /* 内层 2 */
4   */
5*/
6

利用嵌套,可以快速“整块注释”掉代码,而不用担心内部已有注释冲突。

分号:可加可不加

1let a = 1; let b = 2          // 同一行多条语句才需要
2

小结 & 工程化思考

  1. 默认用 Int、Double,除非有明确位宽需求。
  2. 常量优先(let),减少可变状态。
  3. 命名用英文/中文均可,但团队要统一;CI 可加 --strict-conventions 检查。
  4. 类型转换显式写,让 Code Review 一眼看出截断/溢出风险。
  5. typealias 不仅为了“少打字”,更是语义抽象,跨平台迁移利器。

Swift 基础语法全景(一):从变量到类型安全》 是转载文章,点击查看原文


相关推荐


Linux挂载NTFS分区指南
依赖倒不置2025/10/12

在使用Windows和Linux双系统的电脑上,通常我们可能也需要在Linux上访问NTFS分区。虽然Linux用户一般来说不一定会有分区的习惯,但是在双系统情况下,两个系统复用NTFS分区也是很常见的。 今天,就来讨论双系统复用分区的场景下,如何正确地在Linux挂载NTFS分区。 1,Linux的NTFS驱动 事实上,老版本的Linux内核并不原生支持读取NTFS分区,尤其是NTFS是Windows系统专有的文件系统,而不是开放的。因此很长一段时间,都是使用ntfs-3g这个开源驱动实现在L


老题新解|十进制转二进制
程序员莫小特2025/10/10

《信息学奥赛一本通》第160题:十进制转二进制 题目描述 给定一个十进制整数 n n n,请将其转换为对应的二进制表示,并输出。 输入格式 输入包含一行,一个整数 n


单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰
Go有引力2025/10/9

前言 在前一篇文章中,我们详细介绍了 perftest 的单机压测能力,展示了它如何通过极简的命令行实现对 HTTP/1.1、HTTP/2、HTTP/3 与 WebSocket 的高性能测试。然而,当业务系统庞大、服务部署分布式、网络链路复杂时,单机的压测能力显然无法满足真实生产环境的模拟需求。 幸运的是,perftest 不止于单机。它同样支持 分布式集群压测,通过 Collector + Agent 的架构,让你轻松在多台机器上同时发起测试,实现百万乃至千万级并发的性能评估。 为什么选择分


Webpack实战笔记:从自动构建到本地服务器搭建的完整流程
XiangCoder2025/10/7

作为前端开发者,Webpack 是绕不开的构建工具。最近系统学习了 Webpack 的自动构建和服务器搭建,整理了一套从基础到实战的操作笔记,包含具体案例和踩坑经验,适合新手跟着实操。 前言:为什么需要 Webpack 构建工具? 刚开始写前端项目时,我们习惯在 index.html 里手动引入各种 js、css 文件。但随着项目变大,会遇到两个核心问题: 资源越来越多,手动管理引入路径容易出错(尤其是加哈希值优化缓存时); 开发时需要频繁刷新页面看效果,效率太低。 Web


Android系统模块编译调试与Ninja使用指南
龙之叶2025/10/6

模块编译调试方法 (此处举例framework、installd、SystemUI等模块的编译调试,其他类似) 1. Framework模块编译 Android系统代码的framework目录内,一共有3个模块单独编译:framework、services、framework-res.apk。 注意:偶尔会有改了代码但没检测到,编译结束后产物并未更新的情况,所以可以考虑先剪切掉原先的产物或者检查产物更新时间确保已经重新编译。 步骤: 完成根目录下 source build/envsetup.sh


精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序!
追逐时光者2025/10/5

前言 一套优秀的 UI 组件库不仅能大幅提升开发效率,还能显著增强应用的视觉体验与交互质感。今天大姚给大家分享 4 款开源免费、美观实用的 MAUI UI 组件库,助你轻松打造专业级的跨平台应用程序。 .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET开源免费的跨平


医院病人信息管理系统 Web 版开发实战(一)
FPGA+护理+人工智能2025/10/3

医院病人信息管理系统Web版开发实战 文章目录 医院病人信息管理系统Web版开发实战一、概述二、项目结构搭建2.1 Flask 项目结构原理2.2 创建项目文件夹2.3 初始化 Flask 应用 三、路由设计3.1 Flask 路由机制原理3.2 定义核心路由3.3 数据存储函数 四、模板开发4.1 Jinja2 模板引擎原理4.2 基础模板设计4.3 首页模板(index.html)4.4 添加病人模板(add.html)4.5 详情和编辑模板 未完待续


Java-Spring入门指南(十一)代理模式与Spring AOP实战
珹洺2025/10/2

Java-Spring入门指南(十一)代理模式与Spring AOP实战 前言一、代理模式1.1 静态代理步骤1:定义租房接口(抽象行为)步骤2:实现房东类(真实对象)步骤3:编写中介类(代理对象)步骤4:测试静态代理静态代理的优缺点 1.2 动态代理 二、AOP是什么?2.1 AOP是什么?2.2 AOP有什么用?2.3 AOP的使用场景是什么?2.4 AOP的核心特点是什么? 三、AOP在Spring中的应用3.1 准备依赖3.2 配置Spring的AOP命名空间3.3 定义


(14)ASP.NET Core2.2 中的日志记录
老葱头蒸鸡2025/10/2

1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。 2.添加日志提供程序 日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application Insights提供应用程序将这些日志存储在Azure Application Insights中。要添加提供应用程序,请在Program.cs中调用提供程序的Add{provider name}扩


Python 的内置函数 abs
IMPYLH2025/10/2

Python 内建函数列表 > Python 的内置函数 abs 无论是在数学计算、数据分析,还是日常编程中,我们经常需要获取一个数的绝对值。Python 提供的 abs() 函数,可以让我们轻松地计算数字的绝对值,而无需手动判断正负。 abs 函数的参数和返回值如下: def abs(x): ''' 计算参数的绝对值 :param x: 要计算的值 :return: x 的绝对值 ''' 示例 在线运行 print(abs(-50)) p

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0