Swift 学习笔记

1. Swift 简介

Swift 是 Apple 推出的一种编程语言,专为 iOS、macOS、watchOS 和 tvOS 设计。Swift 安全、快速且简洁,提供现代化的语法和强大的编程特性。

print("Hello, Swift!")

注意事项:Swift 的类型安全性较高,确保类型一致非常重要。例如,let 声明的常量一旦赋值不可修改,var 变量允许修改,需清晰区分。

2. 变量与常量

Swift 中的变量用 var 声明,常量用 let 声明。变量的值可以修改,而常量一旦设定不可更改。

var age = 25
let name = "Alice"

注意事项:如果尝试修改常量(如 let 声明的 name),会导致编译错误。确保在代码中合理使用变量和常量,以避免潜在的错误。

3. 数据类型

Swift 提供了多种数据类型,如整数(Int)、浮点数(Double)、字符串(String)和布尔值(Bool)。

var height: Double = 1.75
var isStudent: Bool = true

注意事项:Swift 的类型检查严格,因此不同类型的变量不能直接赋值,如 Int 类型的变量不能直接赋值给 Double 类型变量,除非显式转换。

4. 条件语句

Swift 使用 ifelse ifelse 实现条件判断。条件表达式必须是布尔类型。

let score = 88
if score >= 90 {
    print("优秀")
} else if score >= 80 {
    print("良好")
} else {
    print("一般")
}

注意事项:Swift 中的条件语句需要布尔类型表达式。与其他语言不同,非布尔类型(如整数)不能直接用于条件判断。

5. 循环语句

Swift 支持 for-inwhilerepeat-while 循环。

for i in 1...5 {
    print(i)
}

注意事项:for-in 循环中,如果不需要遍历的值,可以使用下划线(_)代替变量名。此外,确保 whilerepeat-while 循环能在条件不满足时退出,以免进入死循环。

6. 函数

Swift 使用 func 关键字定义函数,支持带参数和返回值的函数。

func greet(name: String) -> String {
    return "Hello, \\(name)!"
}

注意事项:在定义函数时,可以为参数设置默认值。注意函数调用时参数顺序和类型必须匹配函数定义。

7. 类与结构体

Swift 支持类和结构体。类是引用类型,而结构体是值类型。

class Person {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

注意事项:类和结构体的区别在于,类是引用类型(传递时引用相同对象),而结构体是值类型(传递时创建新的副本)。使用结构体时需注意值的不可变性。

8. 闭包

闭包是自包含的代码块,能够在代码中传递并被执行。

let add = { (a: Int, b: Int) -> Int in
    return a + b
}
print(add(3, 5))

注意事项:使用闭包时,可以省略参数类型和返回值。注意闭包捕获值的方式(值捕获或引用捕获),尤其在异步编程中。

9. 错误处理

Swift 使用 do-catch 结构进行错误处理。定义错误类型需要遵循 Error 协议。

enum FileError: Error {
    case notFound
    case unreadable
}

func readFile() throws {
    throw FileError.notFound
}

do {
    try readFile()
} catch FileError.notFound {
    print("文件未找到")
} catch {
    print("未知错误")
}

注意事项:在使用错误处理时,try 关键字需放在可能抛出错误的代码前。确保在错误类型定义时实现 Error 协议。

10. 泛型

泛型使代码更加灵活,允许对不同类型的数据执行相同的操作。

func swapTwoValues(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

注意事项:泛型在类型不确定的情况下使用。需确保泛型在调用时类型一致,否则会导致编译错误。

11. 协议与扩展

协议定义了方法和属性的蓝图,扩展为现有类型添加功能。

protocol Describable {
    func describe() -> String
}

extension Int: Describable {
    func describe() -> String {
        return "This is number \\(self)"
    }
}

注意事项:协议不能包含实现代码,只定义方法和属性。扩展不应重写类本身已有的方法,否则容易产生逻辑错误。

12. 异步编程

Swift 支持异步编程,通过 asyncawait 来实现。

func fetchData() async -> String {
    return "数据已获取"
}

Task {
    let data = await fetchData()
    print(data)
}

注意事项:在异步编程中,确保代码的执行顺序和数据的同步。注意 async 方法的返回类型必须是 await