Swift入门教程:iOS开发第一步——一个35岁老码农的深夜复盘

MQ堵车了
2025-12-18 03:03
阅读 1092

上周五晚上十点半,我瘫在浦东张江某小区出租屋的二手宜家沙发上,左手握着半杯冷掉的瑞幸生椰拿铁,右手还在Xcode里和一个莫名其妙的EXC_BAD_ACCESS错误死磕。女友小雅从浴室出来,一边擦头发一边叹气:“又加班?你不是说今天早点睡吗?”
我苦笑:“这破bug不解决,明天上线就炸了。”
她翻了个白眼:“你都35了,还天天跟编译器谈恋爱?”

这话扎心,但现实。坐标上海,月薪22k(税前),房租3500(合租一室户),每天通勤1小时,女朋友催婚,父母问“什么时候回老家”,而我——还在一线写代码,甚至最近开始啃Swift。


为什么一个后端老狗要碰iOS?

这事得从去年十月说起。

我在一家中型电商公司做Java后端快八年了,日常就是Spring Boot、MySQL、Redis三件套,偶尔调个Kafka。虽然稳定,但总觉得技术栈像泡面——吃多了腻,还不健康。更焦虑的是,公司新来的实习生都在聊SwiftUI、Combine、async/await,而我连Swift语法都没摸过。

有天团建喝多了,CTO拍我肩膀:“老李啊,光会后端不够了。现在全栈才是王道。你看隔壁组那个95后,前端+小程序+iOS全包,提测一次过。”

那一刻,我突然意识到:35岁的程序员,如果只会守着旧技术栈,迟早被优化成“历史遗留问题”

回家路上,地铁14号线晃得我头晕。打开招聘APP一看,“iOS开发”岗位平均薪资比Java高3k,而且很多要求“熟悉后端接口设计”——嘿,这不就是我的机会?

于是,我咬牙做了个决定:用业余时间学Swift,搞iOS开发

小雅一开始反对:“你工作那么累,还折腾这个?不如早点存钱结婚。”
我说:“结了婚我也得吃饭啊。万一哪天裁员名单上有我,至少还能接外包活儿养家。”
她沉默了几秒,最后叹了口气:“行吧,但不准熬夜超过十二点。”
(结果上周五还是熬到凌晨两点……)


入门第一步:别信“三天速成”的鬼话

刚开始学Swift,我犯了个典型错误——直接上手写App

照着B站某个“7天打造抖音级应用”的教程,复制粘贴一堆代码,结果Xcode一运行就闪退。报错信息像天书:“Thread 1: signal SIGABRT”、“Could not cast value of type 'UIView' to 'UIButton'”……

我一度怀疑自己是不是年纪大了,脑子转不动了。

后来冷静下来,翻出Apple官方文档《The Swift Programming Language》,花了整整一周,只学基础语法:变量、可选类型、闭包、协议、内存管理(ARC)。不写UI,不碰StoryBoard,就写控制台程序。

比如这段经典的可选绑定练习:

func getUserAge() -> Int? {
    // 模拟可能为空的数据
    return Int.random(in: 0...1) == 1 ? 28 : nil
}

if let age = getUserAge() {
    print("用户年龄是 \(age)")
} else {
    print("用户年龄未知")
}

看似简单,但理解Optional的本质,比直接拖控件重要一百倍。Swift的安全性,全靠这套机制撑着

那周我每天下班后学1.5小时,周末加起来6小时。小雅看我认真,居然主动把客厅电视音量调低了——感动!


工具链:别让环境配置劝退你

很多人卡在第一步:Xcode太重、模拟器太慢、证书配置像迷宫。

我的建议很实在:

  1. Mac是刚需。别信什么“Hackintosh能跑Xcode”,我试过,更新系统就崩。咬牙买了台M1 Air(16G内存版,花了6899),真香。
  2. Xcode只装最新稳定版。别追Beta,除非你想体验“每日崩溃”。
  3. 用Swift Package Manager(SPM)管理依赖。CocoaPods和Carthage?留给老项目吧。SPM原生集成,清爽如初恋。
  4. 调试神器:Console.app + os_log。比print()强十倍,还能按Subsystem过滤。

记得第一次成功用SPM引入Alamofire(一个网络库),我激动得差点叫出声。小雅从厨房探头:“又搞定bug了?”
我得意:“不,我学会了现代化依赖管理!”
她:“……你开心就好。”


后端思维如何帮到iOS开发?

作为老后端,我最大的优势不是Swift语法,而是对数据流和架构的理解

比如,很多新手一上来就写ViewController里塞满网络请求、数据解析、UI更新。结果代码像意大利面条,改一处崩三处。

我直接套用了后端常用的分层思想:

  • Network Layer:封装API调用,返回Result类型(类似Java的Either)
  • Repository:处理缓存、数据转换
  • ViewModel:用Combine或async/await暴露状态给View
  • View:只负责展示,不包含业务逻辑

举个真实例子:我们App有个商品列表页。后端返回JSON结构复杂,嵌套三层。新手可能会在cellForRowAt里直接解析,导致滑动卡顿。

我的做法:

// Repository 层
class ProductRepository {
    func fetchProducts() async throws -> [Product] {
        let data = try await Network.shared.get("/products")
        return try JSONDecoder().decode([Product].self, from: data)
    }
}

// ViewModel 层
@MainActor
class ProductListViewModel: ObservableObject {
    @Published var products: [Product] = []
    @Published var isLoading = false

    func loadProducts() async {
        isLoading = true
        do {
            products = try await repository.fetchProducts()
        } catch {
            // 统一错误处理
        }
        isLoading = false
    }
}

View 只监听 @Published 变量,完全不知道数据从哪来。这样以后换GraphQL、加本地缓存,都不用动UI代码。

小雅有次看我画架构图,笑我:“你写个手机App搞得像微服务。”
我说:“这叫专业!”


开发心得:那些没人告诉你的坑

  1. 自动引用计数(ARC)不是万能的。闭包里[weak self]必须写,否则内存泄漏到你怀疑人生。我曾因漏写,导致页面退出后定时器还在跑,用户电量哗哗掉。
  2. 主线程只能干UI的事。网络、文件读写统统扔后台。用Task { }或者DispatchQueue.global().async
  3. Storyboard vs SwiftUI:如果你是新人,直接学SwiftUI。Storyboard耦合度高,协作困难,Apple自己都在推SwiftUI。
  4. 测试别偷懒。XCTest写单元测试很简单,尤其是纯函数。我给Repository层写了90%覆盖,上线后少背多少锅!

最惨的一次:上线前没测iPhone SE(小屏幕),结果按钮被键盘盖住,用户投诉如潮。现在我养成了习惯:所有UI必须在三种尺寸模拟器跑一遍


从教程到实战:我的第一个上线App

学了两个月后,我接了个外包:给朋友的宠物店做个预约小程序(其实是iOS App)。

需求简单:查看服务、选时间、填信息、提交。

我用SwiftUI + Firebase(Auth + Firestore)三天搭出原型,后端接口自己用Node.js写了个简易版(毕竟老本行)。重点来了——因为懂后端,我知道怎么设计合理的API字段,避免前端各种奇葩转换

比如,后端直接返回service_duration_in_minutes: 60,而不是"1小时"。前端想显示“1小时”还是“60分钟”,自己格式化。

上线那天,我请小雅吃了顿人均300的日料(心疼钱包)。她说:“看你眼睛发光的样子,好像回到了刚毕业那会儿。”


写给同样在路上的你

35岁学新技术,真的难吗?
难。记忆力不如从前,下班累得只想躺平,看到年轻人卷算法心里发慌。

只要方向对,慢就是快

我不再追求“速成”,而是每天搞懂一个小概念。三个月下来,Swift已能熟练使用,最近还在研究TCA(The Composable Architecture)。

如果你也是后端转移动端,记住:

  • 别怕从基础开始。语法、内存管理、异步模型,这些底层逻辑通了,框架随便换。
  • 利用你的后端优势:理解RESTful、HTTP状态码、数据库设计,这些在移动端一样重要。
  • 工具只是工具。Xcode再难用,也比当年Eclipse配WebLogic强(笑)。

最后一点思考

写这篇教程时,已经是凌晨一点。窗外张江的写字楼还有几盏灯亮着,不知道又是哪个“不认命”的程序员在加班。

35岁,不是终点,而是重新校准的起点。
技术会过时,但解决问题的能力永远不会

也许明年,我就不用再为22k的工资焦虑;也许后年,我和小雅能在外环外付个首付;也许再过五年,我能开个小工作室,接点海外远程单子……

但无论如何,今晚这行Swift代码,我得先跑通。

因为,每个伟大的App,都是从一行print("Hello, World!")开始的


作者:老李,35岁,上海打工人,白天Java后端,晚上Swift萌新。目前仍在和女友合租,梦想是早日还清花呗,以及——写出不闪退的App。

评论 0

最热最新
暂无评论
MQ堵车了Lv.1
0
影响力
0
文章
0
粉丝