iOS 开发学习路线计划
适用对象:Android 开发工程师,已具备面向对象编程基础
学习路线总览
第一阶段:Swift 语法基础 (预计 1-2 周)
│
├─ 1.1 Swift vs Kotlin 对比学习
├─ 1.2 类型系统与 Optional
├─ 1.3 协议与扩展
├─ 1.4 泛型编程
└─ 1.5 Swift 高级特性
第二阶段:UI 框架入门 (预计 1-2 周)
│
├─ 2.1 SwiftUI 基础
├─ 2.2 UIKit 基础
├─ 2.3 SwiftUI vs UIKit 选择
└─ 2.4 常用 UI 组件
第三阶段:核心功能开发 (预计 2-3 周)
│
├─ 3.1 数据存储 (UserDefaults/CoreData/SQLite)
├─ 3.2 网络请求 (URLSession/Alamofire)
├─ 3.3 JSON 解析
└─ 3.4 线程与异步 (GCD/async-await)
第四阶段:系统框架 (预计 1-2 周)
│
├─ 4.1 蓝牙开发 (CoreBluetooth)
├─ 4.2 相机与相册 (AVFoundation/Photos)
├─ 4.3 传感器 (CoreMotion/CoreLocation)
└─ 4.4 通知与权限
第五阶段:架构与工程化 (预计 1-2 周)
│
├─ 5.1 MVVM 架构
├─ 5.2 依赖管理 (CocoaPods/SPM)
├─ 5.3 常用第三方库
└─ 5.4 项目结构组织
第六阶段:打包与分发 (预计 1 周)
│
├─ 6.1 Xcode 与签名
├─ 6.2 App Store 上架
├─ 6.3 打包与分发 (xcarchive/xcframework)
└─ 6.4 TestFlight 内测
第一阶段:Swift 语法基础
阶段目标
掌握 Swift 语言核心语法,理解与 Kotlin 的差异,能够阅读和编写 Swift 代码。
学习内容
1.1 Swift vs Kotlin 对比学习
| Kotlin | Swift | 说明 |
|---|---|---|
val / var |
let / var |
常量/变量声明 |
data class |
struct |
值类型数据类 |
object |
class + singleton |
单例模式 |
companion object |
static |
静态成员 |
sealed class |
enum (关联值) |
密封类/枚举 |
?. / ?.let |
? / guard let |
空安全 |
when |
switch |
模式匹配 |
by lazy |
lazy |
延迟初始化 |
inline class |
@propertyWrapper |
属性包装 |
1.2 类型系统与 Optional
swift
// Optional 类型 - 类似 Kotlin 的可空类型
var name: String? = nil
var age: Int? = 10
// 解包方式 1: if-let (类似 ?.let)
if let unwrappedName = name {
print(unwrappedName)
}
// 解包方式 2: guard-let (推荐,类似 Kotlin 的 let + Elvis)
func greet(_ name: String?) {
guard let name = name else {
print("无名字")
return
}
print("Hello, \(name)")
}
// 解包方式 3: ?? 操作符 (Elvis 操作符)
let displayName = name ?? "Unknown"
// 解包方式 4: 隐式解包
var implicitName: String! = "Hello"
print(implicitName) // 不需要解包,但危险
学习资源:
- Swift 官方文档 - The Basics
-
Swift vs Kotlin 对比\](https:// Kotlin 与 Swift 语法对比)
swift
// 协议 (类似 Kotlin 的接口,但更强大)
// 可以有默认实现、关联类型、协议组合
protocol Drawable {
var color: String { get set }
func draw()
}
// 协议扩展 (类似 Kotlin 的扩展函数)
extension Drawable {
func drawWithDefault() {
print("默认绘制")
}
}
// 面向协议编程示例
struct Circle: Drawable {
var color: String
var radius: Double
func draw() {
print("画圆: \(color), 半径: \(radius)")
}
}
1.4 泛型编程
swift
// 泛型函数 (类似 Kotlin)
func swap<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
// 泛型约束 (类似 Kotlin 的 where)
func findMax<T: Comparable>(in array: [T]) -> T? {
return array.max()
}
// 泛型结构体
struct Stack<Element> {
var items: [Element] = []
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element? {
return items.popLast()
}
}
1.5 Swift 高级特性
swift
// 高阶函数 (类似 Kotlin)
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 } // [2, 4, 6, 8, 10]
let evens = numbers.filter { $0 % 2 == 0 } // [2, 4]
let sum = numbers.reduce(0) { $0 + $1 } // 15
// 闭包语法糖
let sorted = numbers.sorted { $0 > $1 }
// resultBuilder (用于声明式 UI)
@ViewBuilder
func makeView() -> some View {
Text("Hello")
Text("World")
}
// Property Wrapper
@propertyWrapper
struct UserDefault<T> {
let key: String
var wrappedValue: T?
init(key: String) {
self.key = key
self.wrappedValue = UserDefaults.standard.object(forKey: key) as? T
}
}
// 访问控制 (比 Kotlin 更细致)
open // 公开,可被重写和访问 (类似 Java public)
public // 公开,不能被重写
internal // 内部,模块内可见 (默认)
fileprivate // 文件私有
private // 私有
阶段练习
- 实现一个
LinkedList<T>泛型链表 - 用协议实现一个可排序的
Sortable接口 - 编写一个工具类,带有
map、filter、flatMap扩展
第二阶段:UI 框架入门
阶段目标
理解 SwiftUI 和 UIKit 的核心概念,掌握常用 UI 组件,能够构建简单的 iOS 界面。
学习内容
2.1 SwiftUI 基础
swift
import SwiftUI
// 视图定义 (类似 Jetpack Compose)
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 20) {
Text("计数: \(count)")
.font(.largeTitle)
HStack {
Button("减少") {
count -= 1
}
Button("增加") {
count += 1
}
}
}
.padding()
}
}
// 预览
#Preview {
ContentView()
}
2.2 UIKit 基础
swift
import UIKit
// UIKit 方式 (类似 Android View 系统)
class ViewController: UIViewController {
private let label = UILabel()
private let button = UIButton(type: .system)
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// 添加 Label
label.text = "Hello UIKit"
label.textAlignment = .center
label.frame = CGRect(x: 50, y: 100, width: 300, height: 50)
view.addSubview(label)
// 添加 Button
button.setTitle("点击我", for: .normal)
button.frame = CGRect(x: 100, y: 200, width: 200, height: 44)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
view.addSubview(button)
}
@objc func buttonTapped() {
label.text = "按钮被点击!"
}
}
2.3 SwiftUI vs UIKit 选择
| 场景 | 推荐 | 原因 |
|---|---|---|
| 新项目、快速开发 | SwiftUI | 声明式、代码量少 |
| iOS 15+ App | SwiftUI | 现代化特性支持 |
| 需要精细控制 | UIKit | 更底层控制 |
| 复杂动画 | UIKit | Core Animation 更灵活 |
| 已有 UIKit 项目 | 混用 | 渐进式迁移 |
| 第三方 UI 库 | 看库 | 部分库只支持 UIKit |
实际项目中常见做法:SwiftUI 作为主界面 + UIKit 处理特定场景
2.4 常用 UI 组件
SwiftUI 组件
| 组件 | 用途 | Android 对应 |
|---|---|---|
Text |
文本显示 | TextView |
Image |
图片展示 | ImageView |
Button |
按钮 | Button |
TextField / TextEditor |
文本输入 | EditText |
List |
列表 | RecyclerView/ListView |
LazyVStack / LazyHStack |
高性能列表 | RecyclerView |
NavigationStack |
导航 | Fragment + NavController |
TabView |
底部标签页 | BottomNavigationView |
Sheet / FullScreenCover |
弹窗 | Dialog/BottomSheet |
Alert |
警告框 | AlertDialog |
Toggle |
开关 | Switch |
Slider |
滑块 | SeekBar |
ProgressView |
进度条 | ProgressBar |
AsyncImage |
异步图片加载 | Coil/Glide |
ScrollView |
滚动视图 | ScrollView |
LazyVGrid / LazyHGrid |
网格布局 | GridLayout |
VStack / HStack / ZStack |
布局容器 | LinearLayout/FrameLayout |
Group |
分组 | ViewGroup |
UIKit 组件
| 组件 | 用途 | Android 对应 |
|---|---|---|
UILabel |
文本显示 | TextView |
UIImageView |
图片展示 | ImageView |
UIButton |
按钮 | Button |
UITextField / UITextView |
文本输入 | EditText |
UITableView |
表格列表 | ListView/RecyclerView |
UICollectionView |
网格列表 | RecyclerView + GridLayoutManager |
UINavigationController |
导航控制器 | Fragment + NavController |
UITabBarController |
底部标签 | BottomNavigationView |
UIScrollView |
滚动视图 | ScrollView |
UICollectionView |
自定义网格 | RecyclerView |
UIStackView |
堆叠布局 | LinearLayout |
UITableViewCell |
列表项 | ViewHolder |
第三阶段:核心功能开发
阶段目标
掌握 iOS 本地数据存储、网络请求、JSON 解析、异步编程等核心功能开发。
学习内容
3.1 数据存储
swift
// 1. UserDefaults - 轻量级键值存储 (类似 SharedPreferences)
UserDefaults.standard.set("value", forKey: "key")
let value = UserDefaults.standard.string(forKey: "key")
// 2. FileManager - 文件存储 (类似 File API)
let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsPath.appendingPathComponent("data.txt")
// 3. SQLite - 关系型数据库 (类似 Room)
import SQLite
struct User: Codable {
var id: Int?
var name: String
var email: String
}
// 4. CoreData - ORM 框架 (类似 Room,但更重量级)
// 适合复杂对象图和大型数据集
// 5. Keychain - 安全存储 (类似 EncryptedSharedPreferences)
import Security
对比 Android:
| Android | iOS | 适用场景 |
|---|---|---|
| SharedPreferences | UserDefaults | 简单配置 |
| Room | SQLite / CoreData | 结构化数据 |
| File API | FileManager | 文件读写 |
| EncryptedSharedPreferences | Keychain | 敏感数据 |
3.2 网络请求
swift
// 方式 1: URLSession (原生,类似 OkHttp)
func fetchData() async throws {
let url = URL(string: "https://api.example.com/data")!
let (data, response) = try await URLSession.shared.data(from: url)
let decoded = try JSONDecoder().decode(Response.self, from: data)
}
// 方式 2: Alamofire (推荐,类似 Retrofit)
import Alamofire
AF.request("https://api.example.com/data")
.validate()
.responseDecodable(of: Response.self) { response in
switch response.result {
case .success(let value):
print(value)
case .failure(let error):
print(error)
}
}
3.3 JSON 解析
swift
// Codable (类似 Gson/Kotlinx Serialization)
struct User: Codable {
let id: Int
let name: String
let email: String
}
// 解析
let jsonData = Data()
let user = try JSONDecoder().decode(User.self, from: jsonData)
// 编码
let encoded = try JSONEncoder().encode(user)
3.4 线程与异步
swift
// Swift 5.5+ async/await (类似 Kotlin Coroutines)
func fetchUser() async throws -> User {
let url = URL(string: "https://api.example.com/user")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
// 调用
Task {
do {
let user = try await fetchUser()
print(user.name)
} catch {
print("Error: \(error)")
}
}
// Grand Central Dispatch (类似 Handler/Executor)
DispatchQueue.global(qos: .background).async {
// 后台执行
DispatchQueue.main.async {
// 回到主线程更新 UI
}
}
第四阶段:系统框架
阶段目标
了解 iOS 常用系统框架的使用,包括蓝牙、相机、传感器、通知等。
学习内容
4.1 蓝牙开发 (CoreBluetooth)
swift
// 你的 LdBpBle SDK 就是基于 CoreBluetooth
import CoreBluetooth
class BluetoothManager: NSObject {
var centralManager: CBCentralManager!
var discoveredPeripherals: [CBPeripheral] = []
func startScanning() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
}
extension BluetoothManager: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(withServices: nil, options: nil)
}
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
discoveredPeripherals.append(peripheral)
}
}
4.2 相机与相册
swift
// 相机 (类似 CameraX)
import AVFoundation
// Photos 框架 (类似 Photo Library API)
import Photos
// 请求权限
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
if status == .authorized {
// 访问相册
}
}
4.3 传感器
swift
// 位置 (类似 Google Play Services Location)
import CoreLocation
let locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// 运动 (类似 SensorManager)
import CoreMotion
let pedometer = CMPedometer()
pedometer.startUpdates(from: Date()) { data, error in
if let steps = data?.numberOfSteps {
print("步数: \(steps)")
}
}
4.4 通知与权限
swift
// 本地通知 (类似 NotificationCompat)
import UserNotifications
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge]) { granted, error in
if granted {
let content = UNMutableNotificationContent()
content.title = "标题"
content.body = "内容"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: "id", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
}
}
第五阶段:架构与工程化
阶段目标
掌握 MVVM 架构模式,理解依赖管理,能够组织中大型项目结构。
学习内容
5.1 MVVM 架构
swift
// Model - 数据模型 (类似 Android data class)
struct User: Codable, Identifiable {
let id: Int
let name: String
let email: String
}
// ViewModel - 视图模型 (类似 Android ViewModel + LiveData)
import Combine
class UserViewModel: ObservableObject {
@Published var users: [User] = []
@Published var isLoading = false
@Published var errorMessage: String?
private var cancellables = Set<AnyCancellable>()
func loadUsers() {
isLoading = true
// 模拟网络请求
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
self?.users = [
User(id: 1, name: "Alice", email: "alice@example.com"),
User(id: 2, name: "Bob", email: "bob@example.com")
]
self?.isLoading = false
}
}
}
// View - 视图 (SwiftUI)
struct UserListView: View {
@StateObject private var viewModel = UserViewModel()
var body: some View {
Group {
if viewModel.isLoading {
ProgressView()
} else {
List(viewModel.users) { user in
VStack(alignment: .leading) {
Text(user.name).font(.headline)
Text(user.email).font(.subheadline).foregroundColor(.gray)
}
}
}
}
.onAppear {
viewModel.loadUsers()
}
}
}
5.2 依赖管理
swift
// 方式 1: Swift Package Manager (Xcode 内置)
// File > Add Packages > 添加 Git 仓库
// 方式 2: CocoaPods (类似 Gradle)
// Podfile 方式管理依赖
platform :ios, '15.0'
use_frameworks!
target 'MyApp' do
pod 'Alamofire', '~> 5.0'
pod 'SnapKit', '~> 5.0'
end
5.3 常用第三方库
| 库名 | 用途 | Android 对应 |
|---|---|---|
| Alamofire | 网络请求 | Retrofit + OkHttp |
| SnapKit | Auto Layout 约束 | ConstraintLayout |
| Kingfisher | 图片加载缓存 | Coil/Glide |
| SQLite.swift | SQLite 封装 | Room |
| SwiftyJSON | JSON 解析 | Gson/Kotlinx Serialization |
| KeychainAccess | Keychain 封装 | EncryptedSharedPreferences |
| Lottie | 动画播放 | Lottie |
| Charts | 图表 | MPAndroidChart |
| Reachability.swift | 网络状态 | Connectivity |
5.4 项目结构组织
MyApp/
├── App/
│ ├── MyAppApp.swift # App 入口
│ └── AppDelegate.swift # App 生命周期
├── Core/
│ ├── Network/ # 网络层
│ │ ├── APIClient.swift
│ │ └── APIEndpoints.swift
│ ├── Storage/ # 存储层
│ │ ├── UserDefaults+Extensions.swift
│ │ └── DatabaseManager.swift
│ └── Extensions/ # 扩展
│ ├── Color+Extensions.swift
│ └── View+Extensions.swift
├── Features/
│ ├── Home/ # 首页功能模块
│ │ ├── Views/
│ │ │ └── HomeView.swift
│ │ ├── ViewModels/
│ │ │ └── HomeViewModel.swift
│ │ └── Models/
│ │ └── HomeItem.swift
│ └── Profile/ # 个人中心模块
│ ├── Views/
│ ├── ViewModels/
│ └── Models/
├── Shared/
│ ├── Components/ # 共享组件
│ │ ├── LoadingView.swift
│ │ └── ErrorView.swift
│ └── Theme/ # 主题
│ ├── Colors.swift
│ └── Typography.swift
└── Resources/
├── Assets.xcassets
└── Info.plist
第六阶段:打包与分发
阶段目标
理解 Xcode 构建流程、证书签名、App Store 上架流程,能够独立打包发布应用。
学习内容
6.1 Xcode 与签名
签名流程:
开发者账号 → 创建 App ID → 创建证书 → 创建描述文件 → Xcode 配置
| 概念 | 说明 |
|---|---|
| App ID | 应用唯一标识 (Bundle Identifier) |
| Certificate | 证书,用于签名 |
| Provisioning Profile | 描述文件,包含证书和设备列表 |
| Team ID | 开发者团队 ID |
6.2 App Store 上架
上架流程:
代码开发 → Archive → 验证 → 上传 → App Store Connect 配置 → 审核 → 上架
6.3 打包与分发
bash
# 命令行打包
xcodebuild archive \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-archivePath ./build/MyApp.xcarchive
# 导出 IPA
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath ./build
6.4 xcframework 构建 (你已学的)
bash
# 构建多架构 framework
xcodebuild build \
-scheme MySDK \
-destination 'generic/platform=iOS' \
-configuration Release \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# 合并为 xcframework
xcodebuild -create-xcframework \
-framework build/Release-iphoneos/MySDK.framework \
-framework build/Release-iphonesimulator/MySDK.framework \
-output MySDK.xcframework
学习资源推荐
官方文档
在线课程
书籍
- 《Swift 编程权威指南》
- 《iOS 编程实战》
- 《Effective Swift》
工具
- Xcode - IDE
- App Store Connect - 应用管理
- TestFlight - 内测分发
建议的学习顺序
- 第一周: 专注 Swift 语法,对比 Kotlin 学习
- 第二周: 搭建 Hello World,理解 View 概念
- 第三周: 学习 SwiftUI 基础组件
- 第四周: 实现一个 Todo App,串联所有知识
- 第五周: 学习网络请求和数据存储
- 第六周: 学习 MVVM 架构和依赖管理
- 第七周: 学习系统框架(蓝牙、相机等)
- 第八周: 完整开发一个 App 并上架
快速参考卡片
Android → iOS 概念对照
| Android | iOS |
|---|---|
| Activity | UIViewController |
| Fragment | UIViewController (或 SwiftUI View) |
| View | SwiftUI View / UIView |
| ViewModel | ObservableObject |
| LiveData | @Published |
| DataBinding | @State / @Binding |
| RecyclerView | List / LazyVStack / UITableView |
| ConstraintLayout | SwiftUI Stack / UIStackView / SnapKit |
| SharedPreferences | UserDefaults |
| Room | SQLite.swift / CoreData |
| Retrofit | Alamofire / URLSession |
| OkHttp | URLSession |
| Glide | Kingfisher / AsyncImage |
| Coroutines | async/await |
| Handler | DispatchQueue |
| ViewPager2 | TabView / UIPageViewController |
| BottomNavigationView | TabView |
| Navigation Component | NavigationStack |
| Intent | 页面跳转 (NavigationLink / push) |
| Gradle | CocoaPods / SPM |
| AndroidManifest | Info.plist |
| ProGuard | 代码混淆 (可选) |
| APK | IPA |
| AAB | App Store Upload |
祝学习顺利!如有具体问题,欢迎随时提问。