Swift —— Apple的现代编程语言,在WWDC 2014上作为Objective-C的替代品推出。Swift结合了安全类型化、自动引用计数(ARC)内存管理和面向协议的方法。Swift Programming Language —— 语言语法和标准库的主要来源。
要点
Swift —— Apple为iOS、macOS、watchOS、tvOS和visionOS开发的多范式编程语言。语言的关键目标:安全性、速度和语法的表现力。Swift使用LLVM编译器,生成优化的机器代码,性能可与C++媲美。
自2014年发布以来,Swift经历了6个主要版本。Swift 6(2024)通过严格控制并发代码隔离,引入了完整的数据竞争安全模型。根据GitHub Octoverse 2025,Swift在社区增长方面位列前10名语言,在Apple平台上的采用速度超过了Rust和Kotlin。
Swift是开放和跨平台的——源代码发布在GitHub上(Swift Open Source)。除了Apple平台,Swift还用于Linux和Windows上的服务器开发(Vapor、Hummingbird),尽管主要应用领域仍然是Apple生态系统中的移动和桌面应用开发。
过渡的主要原因:Swift消除了Objective-C中可能出现的整类错误。类型安全可在编译阶段防止类型不匹配。Optionals消除了nil解引用。ARC从第一天起就内置其中,与Objective-C中的MRC/ARC不同。Swift的语法更短、更易读——研究表明,在解决类似任务时,与Objective-C相比,代码量减少了30-40%。
Swift的基本语法将熟悉的类似C的结构与函数式语言的元素相结合。变量通过var声明,常量通过let声明。编译器使用类型推断,因此仅在存在歧义时才需要显式指定类型。
import Foundation
// 常量和变量
let name = "Swift"
var version = 6.0
var count: Int = 42
// 具有默认参数的函数
func greet(person: String, greeting: String = "Hello") -> String {
return "\(greeting), \(person)!"
}
// 用于提前退出的Guard-let
func parse(input: String?) -> Int {
guard let value = input, let number = Int(value) else {
return 0
}
return number
}Switch和模式匹配在Swift中比在C和Kotlin中更强大。Switch支持与元组、范围、where条件和值绑定的匹配。编译器检查所有case的穷尽覆盖——如果所有可能的值都已覆盖,缺少default不是错误。
let point = (x: 3, y: -1)
switch point {
case (0, 0):
print("坐标原点")
case let (x, y) where x == y:
print("X等于Y")
case let (x, y) where abs(y) > x:
print("Y模X大于")
default:
print("点 (\(point.x), \(point.y))")
}Optionals —— Swift的核心概念,在类型系统层面解决了空引用问题。Optional<Wrapped>是一个包含两个case的枚举:.none(nil)和.some(Wrapped)。编译器禁止未经显式检查使用Optional,从而消除了整类运行时错误。
var optionalString: String? = "Hello"
optionalString = nil // 允许
// Optional Binding — 安全提取
if let text = optionalString {
print("文本:\(text)")
} else {
print("值不存在")
}
// Optional Chaining — 安全访问属性
let length = optionalString?.count ?? 0
// Nil-coalescing运算符
let greeting = optionalString ?? "Default"Optional Chaining使用?.运算符可以安全地调用方法和访问可选值的属性。如果链被nil中断,整个表达式的结果为nil。Nil-coalescing(??)提供默认值,并广泛用于UI代码中显示占位符文本。
协议在Swift中定义了契约——一组属性和方法。与Java接口不同,Swift协议可以通过协议扩展拥有默认实现。这是面向协议编程的基础,也是Apple推荐的替代类继承的方法。
protocol NamedEntity {
var name: String { get }
func description() -> String
}
// 通过扩展的默认实现
extension NamedEntity {
func description() -> String {
return "Entity: \(name)"
}
}
// 通过扩展的符合性
extension String: NamedEntity {
var name: String { return self }
}协议扩展允许向协议添加方法而无需修改每个符合类型。这对于添加通用工具特别有用:Sequence的map、filter、reduce,或用于JSON序列化的Codable。Apple在许多框架(SwiftUI、Combine)中构建了带有扩展的协议。
闭包在Swift中——捕获外部上下文变量的匿名函数。在语法上,闭包类似于Kotlin中的lambda,但具有更灵活的语法:尾随闭包、简写参数名($0、$1)和自动闭包。
// 带有上下文捕获的闭包
let numbers = [5, 3, 8, 1, 9]
// 尾随闭包语法
let sorted = numbers.sorted { $0 < $1 }
// 函数式链
let result = numbers
.filter { $0 > 3 }
.map { $0 * 2 }
.reduce(0, +)
// 作为函数参数的闭包
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }@escaping闭包在闭包从函数返回后执行时使用——通常用于网络请求和异步操作。@autoclosure自动将表达式包装到闭包中,用于assert和短路逻辑。
选择结构体和类——设计Swift模型时的首要决策之一。Apple建议默认使用结构体(值类型),仅在需要继承或通过引用标识时切换到类(引用类型)。
| 特性 | 结构体 | 类 |
|---|---|---|
| 传递方式 | 按值(拷贝) | 按引用 |
| 继承 | 不支持 | 支持 |
| ARC管理 | 不需要 | ARC(引用计数) |
| 析构器deinit | 无 | 有 |
| 可变性 | mutating func修改属性 | 任何方法都可修改 |
| 集合中存储 | 插入时拷贝 | 存储引用 |
值类型(结构体)在多线程环境中更安全——每个线程获得独立的副本。引用类型(类)用于处理UIKit(UIView、UIViewController),其中需要引用标识和系统类的继承。
ARC(自动引用计数) —— Swift用于引用类型的内存管理系统。编译器在运行时插入retain/release,跟踪对象的强引用计数。当计数归零时,对象立即被释放。
ARC的主要问题——循环引用。当两个对象持有彼此的强引用时,内存无法释放。解决方案是weak引用(释放时自动变为nil)和unowned引用(保证对象存活)。
class ProfileViewController: UIViewController {
var onLogout: (() -> Void)?
func setupHandler() {
// [weak self] 防止循环引用
onLogout = { [weak self] in
guard let self else { return }
self.dismiss(animated: true)
}
}
}为防止闭包中的循环引用,使用[weak self]配合guard let self = self else { return }。这条规则在UIKit中尤其重要,其中ViewController持有对其属性的强引用,而这些属性内部的闭包又引用了ViewController。
常见问题
Swift支持Int、Double、Float、String、Bool、Array、Set、Dictionary和元组。数值类型具有固定大小:Int8、Int16、Int32、Int64和无符号UInt。日期处理使用Foundation中的Date,数据处理使用Data。
Optional —— 一个包含两个case的枚举:.none(nil)和.some(Wrapped)。Swift需要通过if let、guard let或??对Optional进行显式检查,从而消除了NullPointerException。可选链(?.)允许安全地访问嵌套可选值的属性。
结构体——值类型,赋值时拷贝,不支持继承,不需要ARC。类——引用类型,通过引用传递,支持继承和析构器。Apple推荐结构体作为默认类型。
ARC自动计算类对象的强引用。当计数归零时,内存被释放。为防止循环引用,使用weak(自动变为nil)和unowned(保证生命周期)。ARC不适用于结构体和枚举。
面向协议编程——一种使用带有扩展的协议替代类层次结构的方法。协议可以通过协议扩展包含方法的默认实现。这允许在没有继承的情况下重用代码,同时保持灵活性和可测试性。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。