iOS 实战指南
swift var greeting = "Hello, iOS!" print(greeting)
点击左下角的运行按钮即可看到输出结果。
## 2. Swift 语言核心速览
掌握以下基础知识,足以开始实战项目。遇到未接触的语法时再回头查阅即可。
### 2.1 变量与常量
- `var` 定义变量,值可以更改。
- `let` 定义常量,值初始化后不可变。
```swift
var score = 0
score = 10
let maxScore = 100
2.2 基本数据类型
常用类型:String、Int、Double、Bool。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 搭建界面
- 打开 Main.storyboard,从右上角“+”按钮打开 Library(或快捷键 Shift + Cmd + L)。
- 拖拽一个 Label 到视图中央,双击修改文字为“0”。
- 再拖入一个 Button,放置在 Label 下方,双击修改标题为“点击 +1”。
- 点击左上角“分屏”按钮打开 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")
}