Swift:是什么、语法和语言关键概念

作者: IT Sectr 发布日期: 2026-02-09 阅读时间: 8 分钟

Swift —— Apple的现代编程语言,在WWDC 2014上作为Objective-C的替代品推出。Swift结合了安全类型化、自动引用计数(ARC)内存管理和面向协议的方法。Swift Programming Language —— 语言语法和标准库的主要来源。

要点

  • Swift —— 具有类型推断、Optionals和面向协议编程的静态类型语言
  • Optionals —— 通过Optional Binding(if let)和Optional Chaining(?.)安全地处理nil
  • ARC —— 无需手动retain/release的自动引用计数内存管理
  • Closures —— 带有上下文捕获的匿名函数,用于回调API和函数式链
  • Struct vs Class —— 在赋值和继承方面行为不同的值类型与引用类型

什么是Swift?

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

过渡的主要原因:Swift消除了Objective-C中可能出现的整类错误。类型安全可在编译阶段防止类型不匹配。Optionals消除了nil解引用。ARC从第一天起就内置其中,与Objective-C中的MRC/ARC不同。Swift的语法更短、更易读——研究表明,在解决类似任务时,与Objective-C相比,代码量减少了30-40%。

语法和基本结构

Swift的基本语法将熟悉的类似C的结构与函数式语言的元素相结合。变量通过var声明,常量通过let声明。编译器使用类型推断,因此仅在存在歧义时才需要显式指定类型。

swift
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不是错误。

swift
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和安全处理nil

Optionals —— Swift的核心概念,在类型系统层面解决了空引用问题。Optional<Wrapped>是一个包含两个case的枚举:.none(nil)和.some(Wrapped)。编译器禁止未经显式检查使用Optional,从而消除了整类运行时错误。

swift
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推荐的替代类继承的方法。

swift
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)和自动闭包。

swift
// 带有上下文捕获的闭包
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内存管理

ARC(自动引用计数) —— Swift用于引用类型的内存管理系统。编译器在运行时插入retain/release,跟踪对象的强引用计数。当计数归零时,对象立即被释放。

ARC的主要问题——循环引用。当两个对象持有彼此的强引用时,内存无法释放。解决方案是weak引用(释放时自动变为nil)和unowned引用(保证对象存活)。

swift
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中有哪些数据类型?

Swift支持Int、Double、Float、String、Bool、Array、Set、Dictionary和元组。数值类型具有固定大小:Int8、Int16、Int32、Int64和无符号UInt。日期处理使用Foundation中的Date,数据处理使用Data。

Swift中的Optional是什么,为什么需要它?

Optional —— 一个包含两个case的枚举:.none(nil).some(Wrapped)。Swift需要通过if let、guard let或??对Optional进行显式检查,从而消除了NullPointerException。可选链(?.)允许安全地访问嵌套可选值的属性。

Swift中结构体和类有什么区别?

结构体——值类型,赋值时拷贝,不支持继承,不需要ARC。类——引用类型,通过引用传递,支持继承和析构器。Apple推荐结构体作为默认类型。

Swift中的ARC内存管理如何工作?

ARC自动计算类对象的强引用。当计数归零时,内存被释放。为防止循环引用,使用weak(自动变为nil)和unowned(保证生命周期)。ARC不适用于结构体和枚举。

Swift中的面向协议编程是什么?

面向协议编程——一种使用带有扩展的协议替代类层次结构的方法。协议可以通过协议扩展包含方法的默认实现。这允许在没有继承的情况下重用代码,同时保持灵活性和可测试性。

总结

  • Swift —— Apple的静态类型语言,具有Optionals、ARC和面向协议编程,用于iOS/macOS开发
  • Optionals —— 通过Optional Binding、Optional Chaining和nil-coalescing运算符安全处理nil
  • 协议 + 扩展 —— 面向协议编程的基础,具有默认方法实现和组合
  • 闭包 —— 具有上下文捕获、尾随语法和用于内存管理的捕获列表的匿名函数
  • 结构体 vs 类 —— 值类型(拷贝、线程安全)与引用类型(继承、ARC)
  • ARC —— 自动引用计数,使用weak/unowned修饰符防止循环引用
  • Switch和模式匹配 —— 穷尽覆盖,与元组、范围和where条件匹配

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读