53 - Swift 入门教程

适用人群:iOS/macOS开发兴趣
难度:中等
预计学习时间:40-50小时

为什么学 Swift?

优势说明
Apple生态iOS/macOS/watchOS/tvOS开发首选
现代语法安全、快速、表达力强
SwiftUI声明式UI框架,开发效率高
就业iOS开发薪资高,需求稳定
开源可用于服务端(Vapor框架)

学习路线

第1阶段:基础语法(2周)
├── 变量(let/var)与类型
├── 字符串与集合(Array/Dictionary/Set)
├── 控制流(if/guard/switch/for-in)
├── 函数与闭包(Closure)
├── 可选类型(Optional)
└── 错误处理(do-try-catch)

第2阶段:面向对象(2周)
├── 类与结构体
├── 属性与方法
├── 继承与协议(Protocol)
├── 扩展(Extension)
├── 泛型
└── 枚举(关联值)

第3阶段:iOS开发(3周)
├── SwiftUI基础(View/State/Binding)
├── 布局系统(VStack/HStack/ZStack)
├── 列表与导航(List/NavigationStack)
├── 网络请求(URLSession)
├── 数据持久化(UserDefaults/SwiftData)
└── MVVM架构

第4阶段:实战项目(3周)
├── 天气应用
├── 待办事项
├── 新闻阅读器
└── 社交应用原型


基础语法速查

// 变量
let name = "Swift"        // 常量(推荐)
var count = 0              // 变量
let pi: Double = 3.14      // 显式类型

// 字符串
let greeting = "Hello, \(name)!"  // 字符串插值
let multi = """
    多行字符串
    支持换行
    """

// 可选类型
var optional: String? = nil
if let unwrapped = optional {
    print(unwrapped)  // 安全解包
}
let value = optional ?? "默认值"  // Nil合并

// 函数
greet(_ name: String, times: Int = 1) -> String {
    return String(repeating: "Hello \(name)! ", count: times)
}

// 闭包
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }        // 简写
let evens = numbers.filter { $0 % 2 == 0 }
let sum = numbers.reduce(0, +)

// 结构体(值类型)
struct Point {
    var x: Double
    var y: Double
    
    func distance(to other: Point) -> Double {
        let dx = x - other.x
        let dy = y - other.y
        return sqrt(dx * dx + dy * dy)
    }
}

// 类(引用类型)
class Animal {
    var name: String
    init(name: String) { self.name = name }
    func speak() -> String { "..." }
}

class Dog: Animal {
    override func speak() -> String { "Woof!" }
}

// 协议
protocol Drawable {
    func draw()
    var description: String { get }
}

struct Circle: Drawable {
    var radius: Double
    func draw() { print("Drawing circle with radius \(radius)") }
    var description: String { "Circle(r=\(radius))" }
}

// 枚举(关联值)
enum NetworkResult {
    case success(data: Data)
    case failure(error: Error)
    case loading
}

// 错误处理
enum AppError: Error {
    case notFound
    case serverError(String)
}

do {
    let data = try fetchData()
} catch AppError.notFound {
    print("Not found")
} catch {
    print("Error: \(error)")
}

SwiftUI 快速上手

import SwiftUI

struct ContentView: View {
    @State private var name = ""
    @State private var items = ["Apple", "Banana", "Cherry"]
    
    var body: some View {
        NavigationStack {
            List {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onDelete { indexSet in
                    items.remove(atOffsets: indexSet)
                }
            }
            .navigationTitle("Fruits")
            .toolbar {
                Button("Add") {
                    items.append("New Item")
                }
            }
        }
    }
}


推荐资源

资源说明
Swift PlaygroundsApple官方互动学习
Hacking with Swift最佳免费Swift教程
Stanford CS193p斯坦福iOS开发课
SwiftUI by ExampleSwiftUI代码示例集

实战项目建议

  1. 记账App:SwiftUI + SwiftData
  2. 天气应用:网络请求 + 地图
  3. 健康追踪:HealthKit集成
  4. 照片编辑:Core Image滤镜
返回首页