Swift入门不难,但别被Xcode吓跑

创新之云端
2026-02-22 07:08
阅读 466

上周五晚上十点半,我正蹲在公司改一个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配置文件还复杂?”

但冷静下来发现,其实核心就三块:

  1. 项目结构:和前端项目差不多,ViewController.swift 就是你的“页面组件”,Assets.xcassets 是放图片的,“Info.plist”相当于 package.json
  2. Storyboard vs 代码布局:新手建议先用Storyboard拖拽界面(所见即所得),但长期项目我强烈推荐纯代码布局(用NSLayoutConstraintSwiftUI),毕竟可维护性更重要——我可是吃过产品经理临时改UI、Storyboard冲突合并到崩溃的亏。
  3. 模拟器: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.labelUIColor.systemBackground,系统会自动切换。
  • 横竖屏切换:如果支持横屏,记得在ViewController里重写viewWillTransition,不然布局会错乱。

我第一次提交TestFlight就被拒了,理由是“在iPad上显示异常”。后来才发现,我没限制设备方向,也没做iPad适配。血泪教训:测试时一定要覆盖所有目标设备!


性能与用户体验:别让用户等

移动端用户耐心极低。我的经验是:

优化项 建议
启动时间 冷启动 < 1.5s,避免在application(_:didFinishLaunchingWithOptions:)里做耗时操作
列表滚动 UITableViewUICollectionView,cell复用,图片懒加载
网络请求 加缓存(URLCache),失败要有重试和提示
内存占用 避免循环引用(用[weak self]),及时释放大对象

有一次我用闭包没加[weak self],结果页面退出后内存没释放,连续进几次就OOM闪退。当时真的想砸Mac(但舍不得,毕竟M1 Pro)。


上架App Store?先过这几关

虽然我只是做Demo,但顺手研究了下上架流程:

  1. 开发者账号:99美元/年,个人就能注册。
  2. 隐私政策:哪怕你的App不联网,只要用了NSLocationWhenInUseUsageDescription这类权限,就必须提供隐私政策URL。
  3. 截图 & 描述:至少需要5张不同尺寸的截图(iPhone + iPad),描述别写“这是一个App”,要突出功能。
  4. 审核:通常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

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝