type
Post
status
Published
date
Jul 18, 2026
slug
summary
通过对比的方式学习Swift语言
tags
开发
category
技术分享
icon
password
ArkTS vs Swift 对比学习指南
本文档面向已有 ArkTS 基础的开发者,通过对比方式快速掌握 Swift 语言核心特性。阅读建议:逐节对比阅读,重点关注「差异要点」和「易错提示」部分。
1. 语言定位与运行机制
对比项ArkTSSwift定位鸿蒙应用开发语言Apple 全平台开发语言基础TypeScript 超集全新设计的语言类型系统静态类型(基于 TS)静态类型(强类型)运行方式编译为 ArkVM 字节码编译为机器码(LLVM)类型推断✅ 支持✅ 支持(更强大)类型安全中等非常严格
核心理解:Swift 的类型安全比 ArkTS 更严格。很多在 ArkTS 中能跑的代码,Swift 编译器会直接报错。这是特性,不是 bug。
2. 变量与常量
声明方式
含义ArkTSSwift可变变量
let x: number = 10var x: Int = 10不可变常量const x: number = 10let x: Int = 10⚠️ 最大差异:ArkTS 用let声明变量、const声明常量;Swift 用var声明变量、let声明常量。完全相反的语义!
类型推断
易错提示
- Swift 中
let是常量,不是变量!这是从 ArkTS 转过来最容易犯的错误
- Swift 字符串用双引号
"hello",和 ArkTS 一样
- Swift 语句末尾不需要分号(写也能通过,但不推荐)
3. 基本数据类型
含义ArkTSSwift备注整数
numberInt(默认)/ Int32 / Int64Swift 的 Int 更精确浮点数numberDouble(默认)/ FloatArkTS 不区分布尔booleanBool—字符串stringString—字符string(单字符)CharacterSwift 有独立字符类型空值null / undefinednilSwift 的 nil 概念不同类型差异详解
类型转换
💡 核心心法:Swift 不做任何隐式类型转换。不同数字类型之间运算必须先统一类型。
4. 字符串
基本操作对比
字符串插值
多行字符串
关键差异速记
操作ArkTSSwift获取长度
.length.count字符串插值`${expr}`"\(expr)"转大写.toUpperCase().uppercased()转小写.toLowerCase().lowercased()分割.split(sep).components(separatedBy: sep)包含检查.includes(str).contains(str)拼接a + b 或 a.concat(b)a + b5. 数组与集合
数组
数组操作对照
操作ArkTSSwift创建
[1, 2, 3][1, 2, 3]追加.push(x).append(x)删除末尾.pop().removeLast()指定位置插入.splice(i, 0, x).insert(x, at: i)指定位置删除.splice(i, 1).remove(at: i)长度.length.count判断空.length === 0.isEmpty判断包含.includes(x).contains(x)遍历for (let x of arr)for x in arr带索引遍历arr.forEach((v, i) => {})for (i, x) in arr.enumerated()集合(Set)
高阶函数对比
💡 Swift 闭包简写:当闭包是最后一个参数时,可以写在{ }里;$0、$1代表第1、2个参数。这比 ArkTS 的箭头函数更简洁。
6. 字典与映射
关键差异
操作ArkTSSwift声明类型
Record<K, V> 或 Map<K, V>[K: V]字面量{ key: value }["key": value]访问dict[key](返回值或 undefined)dict[key](返回 Optional)判空Object.keys(dict).length === 0dict.isEmpty遍历Object.entries(dict)for (k, v) in dict⚠️ 重要:Swift 的字典访问永远返回 Optional。你必须解包才能使用值。这是 Swift 空安全的核心体现。
7. 控制流
if-else
switch
for 循环
⚠️ Swift 没有传统 C 风格的for (init; condition; increment)语法。必须使用范围..<或...或stride。
范围运算符
含义ArkTSSwift半开范围 [a, b)需手动处理
a..<b闭范围 [a, b]需手动处理a...b步长范围需手动处理stride(from:to:by:)guard 语句(Swift 特有)
💡 guard 是 Swift 的重要特色,类似于 ArkTS 中的"提前 return 模式",但更强大——它能在条件满足后自动解包 Optional 供后续代码使用。
8. 函数
基本定义
参数标签(Swift 特有,重要!)
⚠️ Swift 函数调用时参数标签是强制的(除非用_省略)。这是和 ArkTS 最大的区别之一。
默认参数
可变参数
函数作为值
返回多个值
9. 闭包与 Lambda
基本语法
闭包对比详解
捕获行为
逃逸闭包
💡 理解 @escaping:当闭包在函数返回之后才执行(比如异步回调、存储到属性),必须标记@escaping。这是 Swift 编译器帮你管理内存的机制。ArkTS 无此概念。
10. 枚举
基本枚举
关联值(Swift 枚举的杀手锏)
原始值
枚举方法
💡 Swift 枚举极其强大:可以有关联值、原始值、计算属性、方法、协议实现。它不仅仅是常量集合,更像是一种"带数据的类型"。这是和 ArkTS 枚举最大的区别。
11. 结构体
struct vs class 选择
特性struct(值类型)class(引用类型)内存栈分配,拷贝时复制堆分配,拷贝时引用继承❌ 不支持✅ 支持引用计数❌ 不需要✅ ARC 管理多态❌ 不支持✅ 支持Swift 推荐优先使用 struct需要共享/继承时用 class
💡 Swift 核心原则:优先使用 struct。Apple 官方建议:默认用 struct,当你需要引用语义、继承、Objective-C 互操作时才用 class。这与 ArkTS 中几乎全用 class 的习惯完全不同。
12. 类与面向对象
定义类
关键差异
特性ArkTSSwift继承语法
class Dog extends Animalclass Dog: Animal构造器constructor()init()调用父类构造super(...)super.init(...)方法重写直接重写即可必须加 override 关键字属性默认值可在声明处或构造器中赋值可在声明处赋值,或在 init 中赋值this / selfthisself属性修饰符public/private/protectedpublic/private/internal/fileprivate/open属性
convenience 初始化器
💡 Swift 的初始化规则很严格:每个存储属性必须有初始值。子类的指定初始化器必须调用父类的指定初始化器。便捷初始化器必须调用同类的另一个初始化器。这比 ArkTS 的 constructor 灵活但也更复杂。
13. 协议与接口
基本定义
协议属性
协议默认实现(Swift 特有)
协议作为类型
关键差异
特性ArkTS interfaceSwift protocol默认实现❌✅ 通过扩展属性要求只读属性用
readonly{ get } / { get set }协议组合A & B(交叉类型)A & B可选方法? 可选属性@objc optional(需 ObjC 兼容)泛型约束有限支持强大的 where 子句值类型实现❌(只有 class 能实现)✅ struct 和 enum 都能实现💡 Swift 协议远比 ArkTS interface 强大:协议可以有默认实现、可以作为存在类型(existential)、可以约束泛型、可以被 struct/enum 实现。这是 Swift 面向协议编程的基础。
14. 泛型
基本泛型
泛型约束
关联类型
💡 Swift 泛型是编译时的真泛型(reified generics),不像 ArkTS 的泛型在运行时被擦除。这意味着你在运行时可以获取泛型类型信息。
15. Optional 与空安全
核心概念
Optional 详解
多重可选绑定
Optional 速查
操作语法说明声明 Optional
var x: Type?可以是 nil声明非 Optionalvar x: Type不能是 nil,必须有值强制解包x!为 nil 时崩溃安全解包if let v = x { }推荐方式guard 解包guard let v = x else { return }提前退出可选链x?.property链中任一为 nil 则返回 nil空值合并x ?? defaultValue为 nil 时用默认值可选映射x.map { $0 * 2 }有值时变换,无值时返回 nil可选.flatMapx.flatMap { $0 * 2 }闭包返回 Optional 时不会嵌套⚠️ 这是从 ArkTS 转来最重要的概念。Swift 的 Optional 不是"可以为 null 的值",而是一个独立的类型。String和String?是不同的类型,不能直接互相赋值。编译器强制你处理 nil 的情况。
16. 错误处理
基本模式
try 的三种形式(Swift 特有)
传播错误
Result 类型
关键差异
特性ArkTSSwift错误类型继承 Error 类实现 Error 协议(通常是枚举)抛出
throw new Error()throw SomeError.case捕获try {} catch(e) {}do { try } catch {}错误信息e.messageerror(自动绑定)可选错误无try? 返回 nil强制错误无try! 失败崩溃传播不需要标注函数必须标注 throws💡 Swift 的错误处理是类型安全的:编译器强制你声明哪些函数可能抛错(throws),调用时必须用try。这比 ArkTS 的运行时异常更安全。
17. 扩展
扩展系统类型
💡 Swift 的 extension 非常强大:可以给任何类型(包括系统类型如 Int、String)添加方法、计算属性、协议实现。这是 ArkTS 完全不具备的能力。
18. 属性观察者
简写形式
💡 属性观察者在 SwiftUI 中极其重要,是数据驱动 UI 更新的核心机制之一。
19. 访问控制
级别ArkTSSwift说明公开
publicpublic模块外可访问开放继承—open模块外可继承/重写(仅 class)内部—internal(默认)模块内可访问文件内私有—fileprivate同一源文件内可访问私有privateprivate同一类型作用域内可访问受保护protected—Swift 没有 protected使用示例
⚠️ Swift 默认是internal,不是public。这与 ArkTS 默认 public 不同。
20. 内存管理
对比项ArkTSSwift管理方式垃圾回收(GC)自动引用计数(ARC)循环引用不太需要担心必须手动处理弱引用
WeakRefweak / unowned值类型无(全是引用)struct / enum 是值类型循环引用处理
闭包的循环引用
⚠️ 这是 ArkTS 开发者转 Swift 最大的陷阱。ArkTS 有 GC 可以自动检测循环引用,但 Swift 的 ARC 不会。你必须用weak/unowned或[weak self]来打破循环引用。
21. 异步编程
Promise vs async/await
并发
关键差异
特性ArkTSSwift异步标记
asyncasync等待awaitawait错误传播throw / try-catchthrows / try并发执行Promise.allasync let / TaskGroup任务取消较难Task.cancel() + Task.checkCancellation()Actor 模型❌✅ actor 类型22. 速查对照表
关键字对照
含义ArkTSSwift声明变量
letvar声明常量constlet声明函数function / 箭头函数func声明类classclass声明结构体—struct声明枚举enumenum声明协议/接口interfaceprotocol继承extends / implements:当前实例thisself空值null / undefinednil可选类型T \| nullT?可选链?.?.空值合并????类型断言as Typeas Type / as! Type / as? Type错误抛出throw new Error()throw Error.case错误捕获try {} catch(e) {}do { try } catch {}异步async / awaitasync / await导入importimport访问修饰符public/private/protectedpublic/private/internal/open/fileprivate类型对照
含义ArkTSSwift整数
numberInt浮点数numberDouble / Float布尔booleanBool字符串stringString字符string(单字符)Character数组T[] / Array<T>[T] / Array<T>字典Record<K, V> / Map<K, V>[K: V] / Dictionary<K, V>元组[T, U](数组模拟)(T, U)集合Set<T>Set<T>OptionalT \| nullT? / Optional<T>任意类型anyAny(值类型)/ AnyObject(引用类型)无返回值voidVoid / ()函数类型(a: T) => U(T) -> U学习建议
1. 思维转变
从 ArkTS 的习惯到 Swift 的正确做法默认用 class默认用 struct
let = 变量var = 变量(let = 常量)null/undefinednil(且必须用 Optional)隐式类型转换永远不隐式转换GC 管理内存ARC + 手动处理循环引用extends 继承: 继承重写方法直接写必须加 overridefor(;;) 循环for in + 范围.push() / .pop().append() / .removeLast().length.count.map(x => ...).map { $0... }2. 重点掌握
- Optional — 这是 Swift 的灵魂,必须彻底理解
- 值类型 vs 引用类型 — struct vs class 的选择
- 协议 — 面向协议编程是 Swift 的核心范式
- 闭包 — 尾随闭包、
$0简写、[weak self]
- 属性观察者 —
willSet/didSet在 SwiftUI 中大量使用
- ARC 内存管理 —
weak/unowned打破循环引用
3. 推荐学习路径
- 先熟悉基本语法(变量、函数、控制流)
- 彻底掌握 Optional(
if let、guard let、??、?.)
- 理解 struct 和 class 的区别
- 学习闭包和尾随闭包语法
- 掌握协议和协议扩展
- 理解泛型
- 学习错误处理
- 进入 SwiftUI(下一份文档)
📝 下一篇:ArkUI vs SwiftUI 对比学习文档(即将生成)当你准备好后,告诉我,我会继续生成 ArkUI 和 SwiftUI 的对比学习文档,涵盖 UI 组件、布局系统、状态管理、导航、动画等核心主题。
- Author:Tao Chen
- URL:https://www.ctstudio.cloud/article/3a19b3f5-e6ae-804c-bbc1-ce14a86ff96f
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!






