一、Swift 是什么
Swift 是一门现代、高效且多范式的编程语言,专门用于开发 iOS、macOS、watchOS 和 tvOS 应用程序。它的诞生是为了解决 Objective-C 在某些方面的限制,并提供更直观、安全和强大的编码方式。
Swift 具有以下特点:
- 易读易写:注重可读性,代码更接近自然语言,使开发者能够更快速地理解和编写代码。
- 安全性:引入了类型推断、空值处理和内存管理等特性,减少了程序崩溃和内存泄漏的可能性。
- 高性能:设计时考虑了性能,与 C 和 Objective-C 相比,它通常更快速,有助于构建响应迅速的应用程序。
- 现代特性:提供了诸如闭包、元组、泛型和模式匹配等现代编程特性,帮助开发者更优雅地解决问题。
- 多范式:Swift 支持面向对象编程、函数式编程和协议导向编程等多种编程范式,使得代码更灵活且易于扩展。
- 开源:Swift 是开源的,这意味着开发者可以参与到语言的演进和改进中,共同构建一个更好的编程生态。
- 丰富的生态系统:Swift 拥有庞大的社区和丰富的第三方库,使开发者能够快速构建复杂的应用程序。
综合来看,Swift 是一个注重开发效率、代码质量和性能的现代编程语言,适合于构建各种规模的 iOS 和 macOS 应用。无论是初学者还是有经验的开发者,都能从 Swift 中获得丰富的开发体验。
接下来分为三部分来介绍 Swift,基础语法 / 高级语言特性 / 多范式。
二、Swift 基础语法
变量和常量
使用 var
关键字来声明变量,使用 let
关键字来声明常量。变量是可以修改的,而常量则是不可修改的。例:
var message = "Hello, world!"
message = "Welcome to Swift!" // 可以修改变量的值
let name = "Swift"
name = "Objective-C" // 常量的值不可修改,会报编译错误
常量的性能更好,并且带来确定性,通常不知道用哪种的时候,就先定义为 let
即可。
数据类型
常用的数据类型包括:
- Int: 整数类型,例如:
let age: Int = 18
- Double 和 Float: 浮点数类型,例如:
let price: Double = 3.99
- Bool: 布尔类型,例如:
let isFinished: Bool = true
- String: 字符串类型,例如:
let message: String = "Hello, world!"
数组和字典
数组是一个有序的集合,字典是一个无序的集合。例:
var fruits = ["apple", "banana", "orange"] // 数组
fruits.append("pear") // 添加一个元素到数组
print(fruits) // 输出:["apple", "banana", "orange", "pear"]
var scores = ["Tom": 90, "Jerry": 80, "Lucy": 85] // 字典
scores["Mary"] = 95 // 添加一个键值对到字典
print(scores) // 输出:["Tom": 90, "Jerry": 80, "Lucy": 85, "Mary": 95]
控制流
常用的控制流语句包括:if/else
、for-in
、while
和 switch
。例:
let score = 80
if score >= 90 {
print("优秀")
} else if score >= 80 {
print("良好")
} else if score >= 70 {
print("中等")
} else {
print("不及格")
}
for fruit in fruits {
print(fruit)
}
var i = 0
while i < 10 {
print(i)
i += 1
}
switch score {
case 90...100:
print("优秀")
case 80..<90:
print("良好")
case 70..<80:
print("中等")
default:
print("不及格")
}
延迟加载
只有在首次访问属性时,才会执行初始化操作。可以通过 lazy
关键字来实现。例:
class FileManager {
lazy var fileCount: Int = {
// 执行一些复杂的初始化操作
return 100
}()
}
属性观察器
允许你在属性值即将发生变化或已经发生变化时,执行特定的代码。它可以帮助你在属性状态变化时进行逻辑处理。
使用 willSet
观察器可以在属性值即将被赋新值前执行代码,而使用 didSet
观察器可以在属性值已经被赋新值后执行代码。例:
class Student {
var score: Double = 0 {
willSet {
print("值即将被更新为 \(newValue)")
}
didSet {
print("值已经被更新为 \(score)")
}
}
}
可选类型
可选类型是 Swift 中一个重要的概念,它允许我们在变量中存储值或者一个特殊的值 nil
,表示没有值。可选类型在处理可能为空的值时非常有用,可以帮助我们避免潜在的运行时错误。
1. 声明可选类型:
在 Swift 中,你可以使用 ?
来将一个类型声明为可选类型。例如:
var optionalInt: Int?
这里的 optionalInt
是一个可选的整数类型,它可以存储整数值,也可以存储 nil
。
2. 使用可选类型:
使用可选类型时,需要考虑到可能存在值为空的情况。可以使用可选绑定来判断可选类型是否包含值,并安全地进行访问。例:
if let value = optionalInt {
print("值是 \(value)")
} else {
print("值是 nil")
}
3. 强制解包:
当你确定一个可选类型一定有值时,可以使用强制解包(force unwrapping)来访问其值。但要小心,如果可选类型实际上是 nil
,则强制解包会导致运行时错误,例:
let intValue: Int? = 42
let unwrappedValue = intValue! // 强制解包
print("解包后的值是 \(unwrappedValue)")
4. 隐式解包可选类型:
有些情况下,你可能在声明变量时就确定它一定会有值,但仍将其声明为可选类型。这时可以使用隐式解包可选类型,它在使用时会自动解包。例:
var implicitlyUnwrapped: String! = "Hello"
print("解包后的值是 \(implicitlyUnwrapped)")
5. 可选链
当模型嵌套时,我们不必进行多层的判空操作,可选字段后加 ? 即可,例:
struct Car {
var brand: String
}
struct Person {
var car: Car?
}
// 创建一个有汽车的人
let car = Car(brand: "Toyota")
let person = Person(car: car)
// 使用可选链获取汽车品牌
if let carBrand = person.car?.brand {
print("这个人拥有一辆 \(carBrand) 汽车。")
} else {
print("这个人没有汽车。")
}
6.nil 合并运算符:
当我们希望为可选值提供一个兜底的默认值时可以使用 ??
运算符,以防可选类型为 nil
,例:
let optionalName: String?
let greeting = "Hello \(optionalName ?? "World")"
通过以上这些方式,你可以在 Swift 中安全地处理可能为空的值,避免潜在的崩溃。
模式匹配
允许你根据不同的模式,对值进行匹配和提取。这可以用于条件语句、循环、元组、集合等多种情况,使你的代码可读性更强。
1. 基本的模式匹配:
使用 switch
语句时,可以在不同的 case
中对值进行模式匹配。例:
let number = 5
switch number {
case 0:
print("It's zero")
case 1...5:
print("It's between 1 and 5")
def