Swift入门不难,但别被Xcode吓跑
上周五晚上十点半,我正蹲在公司改一个iOS端的紧急Bug,产品经理突然在群里@我说:“这个功能能不能下周上线?用户反馈很强烈。”
我看着屏幕上那个因为Auto Layout没写好导致iPhone 14 Pro Max上按钮直接飞出屏幕的界面,心里默默翻了个白滚:“你倒是说得轻巧,代码又不是用嘴写的。”
不过话说回来,这其实也怪我——作为主业是后端、副业接外包的斜杠程序员,之前一直靠React Native和Flutter混日子,总觉得原生iOS开发“太重”,直到最近几个客户明确要求必须用Swift原生开发(理由是“性能更好”“上架更稳”),我才不得不硬着头皮重新拾起Xcode。
今天这篇技术分享,就是写给像我一样——平时用Mac敲代码、Windows只用来测兼容性、有点基础但对iOS一脸懵的新手。别怕,Swift比你想象中友好得多,尤其是配合现在这些AI工具,比如我最近狂用的 Codeium(免费版就够香了)。
为什么我决定认真学Swift?
我在当前公司待了三年多,主要做微服务和API网关,团队氛围不错,但最近越来越觉得“舒适区”快变成“温水煮青蛙”了。加上副业接单时,好几个客户点名要原生iOS App,甚至有HR在面试时直接问:“会Swift吗?我们新项目全栈都要懂点移动端。”
求职市场变了。 现在中小厂招“全栈”已经不是让你前后端都会,而是希望你前端能Vue/React,后端能Go/Java,移动端还能搞个Swift/Kotlin应急。虽然我不打算转行做iOS工程师,但会点原生开发,谈外包报价时底气都足三分。
于是,我给自己定下目标:两周内,用纯Swift写一个能上架TestFlight的小Demo。
别被Xcode劝退,它只是长得凶
第一次打开Xcode的时候,我差点以为自己进了航天控制中心——左边是项目导航,中间是代码编辑器,右边是检查器,下面还有调试控制台,顶部还有一堆Scheme、Simulator、Device选项……我当时就想:“这玩意儿能比Kubernetes配置文件还复杂?”
但冷静下来发现,其实核心就三块:
- 项目结构:和前端项目差不多,
ViewController.swift就是你的“页面组件”,Assets.xcassets是放图片的,“Info.plist”相当于package.json。 - Storyboard vs 代码布局:新手建议先用Storyboard拖拽界面(所见即所得),但长期项目我强烈推荐纯代码布局(用
NSLayoutConstraint或SwiftUI),毕竟可维护性更重要——我可是吃过产品经理临时改UI、Storyboard冲突合并到崩溃的亏。 - 模拟器:Mac M1之后跑iOS模拟器飞快,基本秒开。但记得测试真机!有些动画在模拟器丝滑,一上真机就卡成PPT。
Swift语法:比JavaScript讲武德
作为一个常年写JS/TS的人,我本以为Swift会很“啰嗦”,结果发现它反而更清晰、安全、有边界感。
变量与常量
let name = "张三" // 常量,不可变 —— 类似 const
var age = 25 // 变量,可变
小贴士:Swift强制区分可变与不可变,从源头避免意外修改。我以前在JS里不小心把
const user = {name: '李四'}的user.name改了,结果埋了三天的Bug……
类型安全,但不用写死
let score: Int = 100 // 显式声明
let message = "Hello" // 自动推断为 String
Swift会自动推断类型,但一旦确定就不能乱来。比如你不能把String赋值给Int变量,编译器直接报错,根本不会让你运行到线上炸掉。
函数:简洁得不像话
func greet(name: String) -> String {
return "Hi, \(name)!"
}
// 调用
let greeting = greet(name: "老王")
注意:Swift函数参数默认有外部标签(name:),调用时必须写,除非你用_忽略:
func add(_ a: Int, _ b: Int) -> Int { a + b }
add(1, 2) // OK
Optional:Swift的灵魂,也是新手的噩梦
这是Swift最特别的概念之一。比如一个变量可能有值,也可能没有(比如网络请求失败):
var username: String? = nil // ? 表示“可能是String,也可能是nil”
你不能直接用username.count,会报错!必须先解包:
if let name = username {
print("用户名长度:\(name.count)")
} else {
print("用户没登录")
}
或者用guard let提前退出:
guard let name = username else {
return
}
print("欢迎,\(name)!")
刚开始我烦死了,觉得“JS里直接用不就行了?”,直到有一次我漏判了后端返回的null,App直接闪退——那一刻,我跪了,Optional真香。
我的第一个Swift App:一个天气小工具
为了练手,我用Swift写了个简单的天气查询App,只包含两个界面:城市列表 + 天气详情。全程没用Storyboard,纯代码布局 + URLSession请求。
关键代码片段
1. 网络请求(带错误处理)
func fetchWeather(for city: String, completion: @escaping (Result<WeatherData, Error>) -> Void) {
guard let url = URL(string: "https://api.weather.com/v1/...?city=\(city)") else {
completion(.failure(NetworkError.invalidURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(NetworkError.noData))
return
}
do {
let weather = try JSONDecoder().decode(WeatherData.self, from: data)
completion(.success(weather))
} catch {
completion(.failure(error))
}
}.resume()
}
2. 安全更新UI(主线程!)
记住:网络回调在后台线程,更新UI必须切回主线程,否则App可能崩溃或界面不刷新。
fetchWeather(for: "北京") { result in
DispatchQueue.main.async {
switch result {
case .success(let weather):
self.titleLabel.text = "\(weather.temp)°C"
case .failure(let error):
self.showErrorAlert(message: error.localizedDescription)
}
}
}
3. 用Codeium加速开发
写上面那段网络请求时,我其实只打了func fetchWeather(,然后Codeium v0(对,就是那个免费的AI编程助手)就自动补全了整个函数框架,包括Result类型、JSONDecoder、错误处理——省了我至少10分钟查文档的时间。
Codeium目前对Swift支持还不错,虽然不如Python/JS那么强,但写基础CRUD、Model解析、Delegate回调时,能大幅减少样板代码。
适配那些坑:不同机型、刘海屏、暗黑模式
你以为写完逻辑就完了?天真。
- iPhone 14 Pro 的灵动岛:如果你的App顶部状态栏附近有自定义控件,必须用
safeAreaInsets避开,否则会被遮挡。 - 暗黑模式:别用写死的
UIColor.black,用UIColor.label或UIColor.systemBackground,系统会自动切换。 - 横竖屏切换:如果支持横屏,记得在
ViewController里重写viewWillTransition,不然布局会错乱。
我第一次提交TestFlight就被拒了,理由是“在iPad上显示异常”。后来才发现,我没限制设备方向,也没做iPad适配。血泪教训:测试时一定要覆盖所有目标设备!
性能与用户体验:别让用户等
移动端用户耐心极低。我的经验是:
| 优化项 | 建议 |
|---|---|
| 启动时间 | 冷启动 < 1.5s,避免在application(_:didFinishLaunchingWithOptions:)里做耗时操作 |
| 列表滚动 | 用UITableView或UICollectionView,cell复用,图片懒加载 |
| 网络请求 | 加缓存(URLCache),失败要有重试和提示 |
| 内存占用 | 避免循环引用(用[weak self]),及时释放大对象 |
有一次我用闭包没加[weak self],结果页面退出后内存没释放,连续进几次就OOM闪退。当时真的想砸Mac(但舍不得,毕竟M1 Pro)。
上架App Store?先过这几关
虽然我只是做Demo,但顺手研究了下上架流程:
- 开发者账号:99美元/年,个人就能注册。
- 隐私政策:哪怕你的App不联网,只要用了
NSLocationWhenInUseUsageDescription这类权限,就必须提供隐私政策URL。 - 截图 & 描述:至少需要5张不同尺寸的截图(iPhone + iPad),描述别写“这是一个App”,要突出功能。
- 审核:通常1-3天,但节假日可能慢。被拒的话,仔细看邮件里的“Guideline 4.3”之类,针对性修改。
好消息是,现在Apple对小工具类App审核宽松多了,只要你不是山寨、不诱导付费、不收集用户数据,基本都能过。
写给想入坑的你:Swift值得学
回过头看,Swift其实是一门对新手友好、对工程严谨的语言。它不像Objective-C那样充满历史包袱,也不像某些新语言那样激进。Apple这几年一直在优化开发体验,加上Xcode 15对SwiftUI的强力支持,原生开发的门槛其实在降低。
如果你和我一样:
- 在公司待久了想拓展技能树
- 接外包时被客户点名要原生App
- 想在求职时多一张“移动端”牌
那真的,花一周时间啃一啃Swift基础,绝对不亏。不需要成为专家,但至少能看懂、能改、能跑通一个简单项目。
最后说一句:别被“iOS开发”四个字吓住。它只是另一种写代码的方式,核心逻辑、架构思维、调试技巧,和你熟悉的后端或前端并无本质区别。工具会变,解决问题的心不变。
哦对了,我那个天气App已经跑通了,虽然丑了点,但至少能在iPhone 15上正常显示。下一步打算用SwiftUI重写,顺便试试用Codeium v0生成部分UI代码——说不定下周就能接个iOS外包单了?
(完)
作者:一个在Mac上写代码、在Windows上测兼容、正在考虑跳槽的斜杠程序员。主业后端,副业接单,梦想是靠技术自由职业。
技术栈:Go / Node.js / Swift / Flutter
最近在用:Codeium(免费AI编程助手,真香)

评论 0