iOS 实战指南

FreeGuideOnline 最新 2026-07-16

swift var greeting = "Hello, iOS!" print(greeting)

点击左下角的运行按钮即可看到输出结果。

## 2. Swift 语言核心速览
掌握以下基础知识,足以开始实战项目。遇到未接触的语法时再回头查阅即可。

### 2.1 变量与常量
- `var` 定义变量,值可以更改。
- `let` 定义常量,值初始化后不可变。
```swift
var score = 0
score = 10
let maxScore = 100

2.2 基本数据类型

常用类型:StringIntDoubleBool。Swift 具备类型推断,但显式声明能让代码更清晰。

let name: String = "Alice"
let age: Int = 28
let height: Double = 1.75
let isStudent: Bool = false

2.3 控制流与函数

if score >= 60 {
    print("及格")
} else {
    print("不及格")
}

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

func greet(user: String) -> String {
    return "你好,\(user)"
}
print(greet(user: "小明"))

3. 第一个 iOS 应用:计数器

让我们跳脱 Playground,建立一个真正能在 iPhone 上运行的 App。

3.1 新建 Xcode 项目

打开 Xcode,选择“Create a new Xcode project”。在模板中选择 iOS 下方的“App”,点击 Next。输入项目名称“Counter”,语言选择 Swift,界面选择 Storyboard。保存至桌面。

3.2 了解项目结构

项目导航栏中核心文件:

  • Main.storyboard:界面设计文件
  • ViewController.swift:逻辑代码文件
  • Assets.xcassets:图片资源库

3.3 使用 Storyboard 搭建界面

  1. 打开 Main.storyboard,从右上角“+”按钮打开 Library(或快捷键 Shift + Cmd + L)。
  2. 拖拽一个 Label 到视图中央,双击修改文字为“0”。
  3. 再拖入一个 Button,放置在 Label 下方,双击修改标题为“点击 +1”。
  4. 点击左上角“分屏”按钮打开 Assistant 编辑器,确保左侧是 Storyboard,右侧是 ViewController.swift。

3.4 连接界面与代码

按住 Control 键,从 Label 拖拽线条到 ViewController 类的内部,弹出连接窗口:

  • Connection 选择 Outlet
  • Name 输入 countLabel
  • 点击 Connect

同样方法,从 Button 拖线到代码中,这次:

  • Connection 选择 Action
  • Name 输入 addTapped
  • Type 选择 UIButton
  • 点击 Connect

在生成的 addTapped 方法中添加逻辑:

@IBAction func addTapped(_ sender: UIButton) {
    if let currentText = countLabel.text, let currentValue = Int(currentText) {
        let newValue = currentValue + 1
        countLabel.text = "\(newValue)"
    }
}

3.5 运行模拟器

选择顶部 Scheme 旁的设备模拟器(比如 iPhone 15),点击运行按钮 ▶️。在模拟器中每次点击按钮,数字就会加 1。第一个 App 完成!

4. 界面设计进阶:自动布局

为了让界面在不同尺寸的 iPhone 上正确显示,我们需要学习自动布局(Auto Layout)。

4.1 添加约束

在 Storyboard 中选中 Label,点击右下角“Add New Constraints”按钮(类似方块中间有线条)。

  • 设置上下距离中央的约束:勾选“Horizontally in Container”和“Vertically in Container”。
  • 点击“Add 2 Constraints”完成居中。

4.2 Stack View 快速布局

当有多个控件需要整齐排列时,可以使用 Stack View。选中 Button 和 Label,点击右下角“Embed In”按钮选择 Stack View。Stack View 自动将它们组成一个垂直排列的组,并保持整体居中。

5. 数据持久化:保存计数历史

使用 UserDefaults 可以轻量存储简单数据,非常适合计数器这类场景。

5.1 存储与读取

ViewController.swift 中扩展功能:

let defaults = UserDefaults.standard
let historyKey = "countHistory"

func saveValue(_ value: Int) {
    var history = defaults.array(forKey: historyKey) as? [Int] ?? [Int]()
    history.append(value)
    defaults.set(history, forKey: historyKey)
}

func loadHistory() {
    let history = defaults.array(forKey: historyKey) as? [Int] ?? []
    print(history)
}

addTapped 方法末尾调用 saveValue(newValue)。应用下次启动时可以从 UserDefaults 读取全部计数记录。

6. 网络请求:获取在线数据

现代 App 几乎都要联网。我们将用 Swift 原生 URLSession 获取一条随机名言。

6.1 添加网络访问权限

打开项目设置 Info 标签,添加 App Transport Security Settings,并设置 Allow Arbitrary Loads 为 YES(仅演示用,正式产品需配置具体域名)。

6.2 发起 GET 请求

新建函数 fetchQuote

func fetchQuote() {
    let urlString = "https://api.quotable.io/random"
    guard let url = URL(string: urlString) else { return }
    
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let data = data {
            do {
                if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
                   let content = json["content"] as? String {
                    DispatchQueue.main.async {
                        self.quoteLabel.text = content
                    }
                }
            } catch {
                print("解析失败")
            }
        }
    }
    task.resume()
}

quoteLabel 添加为界面上的新 Label,并增加一个“获取名言”按钮调用此方法。

7. 综合实战:待办事项 App

将已学知识整合到一个更完整的项目中。我们将构建一个待办列表(To-Do List),支持添加、删除和持久化任务。

7.1 项目创建与界面

新建“ToDo”项目。Storyboard 中拖入:

  • 一个 Table View,约束铺满整个安全区域。
  • 一个 Button 放置在导航栏区域或底部,用于添加任务。

7.2 设置 Table View 数据源

创建 TableViewController 子类,并实现 UITableViewDataSource 协议:

var tasks: [String] = UserDefaults.standard.stringArray(forKey: "tasks") ?? []

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tasks.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = tasks[indexPath.row]
    return cell
}

7.3 添加新任务

按钮 Action 中弹出 UIAlertController 让用户输入:

let ac = UIAlertController(title: "新任务", message: nil, preferredStyle: .alert)
ac.addTextField()
let submitAction = UIAlertAction(title: "添加", style: .default) { [weak self] _ in
    if let text = ac.textFields?[0].text, !text.isEmpty {
        self?.tasks.insert(text, at: 0)
        self?.saveTasks()
        self?.tableView.reloadData()
    }
}
ac.addAction(submitAction)
ac.addAction(UIAlertAction(title: "取消", style: .cancel))
present(ac, animated: true)

7.4 左滑删除

实现 tableView(_:commit:forRowAt:) 方法:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        tasks.remove(at: indexPath.row)
        saveTasks()
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}

7.5 持久化方法

func saveTasks() {
    UserDefaults.standard.set(tasks, forKey: "tasks")
}