一、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")

default:

print("It's something else")

}

在条件语句中