# SwiftUI - 北京师范大学 iOS Club 学生沙龙（讲稿）

> 原文：https://pjhubs.com/2019/12/02/appleshare1/
>
> 作者：PJHubs · 发布于 2019-12-02 · 标签：演讲、SwiftUI

![](https://i.loli.net/2019/12/13/Uag7GZtndQD5LRA.png)

> 受 Apple 邀请给北京师范大学的同学们做一次分享。主要面向对象是北师大的 iOS Club 同学，分享 WWDC19 中新推出的 SwiftUI 框架带给 Apple 开发者的改变。

## 个人介绍

![](https://i.loli.net/2019/12/13/QusNzrO3YDm1o67.png)

今年毕业于信息科大计算机学院软件工程，现担任今日头条和西瓜视频 iOS 开发工程师，沉迷于 Apple 生态圈的开源爱好者，Vary app 开发者，非常开心的拿到了今年的 WWDC 奖学金，给自己的本科学习画上了一个圆满的句号。

我热爱骑行，并正在筹备环中国游中，目前在学习口琴，准备给自己做的游戏用口琴吹出配乐。

## 与 iOS 的结缘
说起与 iOS 的结缘应该是我高一的时候，当时班里有几个同学有了 iPhone 4 和 iPod touch 4。高中的我是一名狂热的 Android 爱好者，但当我滑动解锁那台 iPod Touch 4 时，我被这流畅的动画彻底折服了！到了高三的时候宿舍有个同学买了 iPod touch 5，我们两个一到周末就在讨论 iOS 和 Android 的优缺点。

![](https://i.loli.net/2019/12/13/2h4fGyHe9BJrpLA.png)

高考结束后呢，我当时几乎花费了我所有的积蓄买了人生中的第一台 Mac。记得非常清楚，在打开 Mac 包装盒时，我并没有着急开机，而是仔仔细细的看了一遍 Mac 的外观，我从未见过笔记本还能有这样的设计。

然后我一直在等着 Xcode 的下载，晚饭都忘了去吃，然后立马照着谭浩强的书写下了第一个 `hello, world`，当时我还不知道怎么编译运行这简单的四五行代码，还专门打了个电话给学长，视频着教会了我怎么编译运行，当我看到打印出的 `hello, world` 时，感觉我真的拥有了整个世界。

后来啊，我加入了学校的 ifLab 社团，可以说是这个社团带给了我永无止尽的编程乐趣，我们一群人在一起像北师大的 iOS Club 一样可以为一个问题纠结讨论一晚上，一群人在一起参加比赛，写好玩有趣的代码。

在我大一学习 iOS 开发的时候，Apple 刚放开了必须购买每年 99 美刀的开发者证书才能进行开发的要求，所以我的前期学习过程中有很长的一段的世界都是拿模拟器进行调试开发的，但后来我接触到的东西越来越多，模拟器以及完全不能满足我了，但是当时我才刚上大学，穷学生一个并没有多少钱，又不好意思找家里拿钱去买 iPhone，但我又非常想要一个运行 iOS 的真机去跑我写的 app，后来实在没有办法，我起草了一个协议，跟舍友和身边的同学说，如果你们赞助我 100 块钱，那么你们以后可以优先使用我写出来的 app。

![](https://i.loli.net/2019/12/13/pjiNFfIDgKv8PUq.png)

刚开始我以为这件事成不了，后来没想的我居然真的靠着同学们你 100 我 100 的凑齐了这 1499 元，买了当时最低配的 iPod touch 6，也就是我手上的这台，它现在运行的系统还是 iOS 8，我一直舍不得升级，音量键也换了，也舍不得卖掉，每次看到它时，都能够热泪盈眶的回想起当初深夜后还趴在电脑前写着代码的那个少年。

### 首届中国 iOS 应用开发大赛
学习了一段 iOS 开发后，我觉得自己的翅膀硬了，开始和和其他几个同学谋划着写个 app 参加各种比赛，想去和全国的同龄人进行交流。我发现了《首届中国 iOS 应用开发大赛》，这个比赛非常有意思，虽然是首届，那也就只有一届，后来这个比赛就跟现在大家都熟知的移动应用创新赛合并了。

![](https://i.loli.net/2019/12/13/Dlt5F4x3AHhuY8X.png)

在这个比赛上我用了各种奇技淫巧、七拼八凑终于完成了一个现在看上去依然觉得很不错的 app，虽然代码写得不怎么样，但是当时我居然能够狠下心来给这个 app 加上了 IM和社区这两个大头。这个 app 一直在我的 github 上放着，代码写得确实不咋地，但每次看到这个 app 的代码提交记录，也回想起了自己当初的坚持。

同时呢，也是通过这个 app，让我在这个比赛上拿到了人生中的第一台 iPad，我很高兴。

### Google Android 全国大学生移动互联网创新挑战赛
Goole Android 的这个比赛呢居然我参加的是最后一届，后续再也没有了，感觉我好像是比赛终结者.....

在参加 Google Android 的比赛过程中呢，我其实是对自己的选择有过动摇，当时我其实已经处在了要考研还是工作的十字路口上，内心还是的非常纠结的。

![](https://i.loli.net/2019/12/13/rRAeN5WdTV7bBzl.png)

我和另外一个小伙伴写了一个基于 Unity 的 Android VR app，最终这个作品在比赛中拿到了银奖，说实话这个作品最终取得的成绩是远超我的预期，因为在参加这个写这个 Android app 的过程中丝毫感受不到乐趣，没有在做 iOS 时内心的那种快乐，没有那种对代码质量的要求，只想着赶紧做完就完了。

因此呢，比赛完毕后，我给了自己一个答案，我要去做能够让自己持续兴奋，能够一直投入热情的事情，而这个事情在我不断的几次实习的过程中找到了，并在今年三月份达到了一个兴趣的最高点。

### 西单 Apple Store 六一儿童节编程活动

![](https://i.loli.net/2019/12/13/7MiZWJXfs2TwUmG.png)

在今年六一儿童节前两天，我和 Kevin 一块去西单 Apple Store 和一群来自燕京小天鹅公益学校的小同学们度过了开心的一个上午。

同时呢，我也真正的、亲眼的见识到了 Apple 在教育领域中所投入的心思，我很羡慕现在的同学们生活在如此美妙的时代，能够有这么多可以利用的工具去实现自己的创意和想法。

这是我第一次与小朋友亲密接触，并且还是在我所擅长的领域，这直接激发了我对教育的热情，小朋友们眼里都有光～所以我现在也在投入一部分精力去做少儿编程非盈利组织的技术志愿者



# WWDC
## 准备过程
很遗憾的说，虽然我从大一就开始学习 iOS 开发的相关知识，但知道去年六月份我才知道有 WWDC 奖学金这回事，当时还是因为微博上有几个 iOS 届的大佬转了洪浩东同学的微博，然后我就非常非常羡慕的在微博上跟着浩东逛了去年的 WWDC。

![](https://i.loli.net/2019/12/13/YslMhouyAx3dcUp.png)

说真的我非常羡慕，去一次大洋彼岸的 WWDC 现场一直是我一个梦想，从这一次开始呢，我就下定决心，明年的 WWDC 我也要争取去！但是到了今年，我也大四了，知道今年的 WWDC 奖学金开放申请的当天我才又从微博上知道了这件事，当时都已经完全忘了这件事了。

我注意看了下到截止日期只有十天，在这短短的十天里我要肚子完成从创意寻找、UI 设计、需求实现和文档说明这所有东西，去头掐尾其实只有八天的时间，当时我还在实习，每天晚上飞奔回宿舍，抓紧一切时间去实现我的想法。

我后来到了圣何塞跟其他奖学金小伙伴聊天的过程中才知道，原来他们大半年前就开始准备了，就我一个人是在这十天开始写的，我现在回想起来，感觉还是想在梦里一样。

### 创意
我们也都非常清楚，apple 近些年在人工智能、AR 和教育等领域投入非常大，如果我们能够专注这几个方面去结合自己的创意做一些东西是最好不过，但是留给我的时间只有短短的十天，在这十天的时间里去实现一个带有人工智能属性或者体验良好的 AR 作品是困难比较大的，我思考后决定，我不能通过通过新技术这一层面去突击，这样很难有亮点。

后来我开始结合 Apple 在教育和文化这两个方面的投入，想到小时候我回外婆家时，我外婆是汉族人，但是村子和附近的地方都是黎族聚集地，我经常会看到村子里的老奶奶身上穿着的衣服，脸上的纹饰，头上戴的头巾的图案，给人一种非常神秘的感觉。

### 起源
![](https://i.loli.net/2019/12/13/xYQCBqTfWKNXwdF.png)

但是这两年再外婆家时，很多老奶奶都去世了，这些传统的手工艺比如黎族织锦和银手工艺很多年轻人都不去学了，流失非常大，感觉再晚几年出生的小盆友，比如说我的孩子，再回到我的外婆家时，估计就啥也看不到了，这些传统文化就都丢失了。因此，我就想着借此机会帮家乡做一些事情。

### 实现过程
从 17 年开始 Apple 都只接收 Playground 的作品，可以是 Xcode Playground 也可以是 iPad Playground。我之前一直没有深入的使用 Playground，因为 Xcode 上的 Playground 真的是太难用了，我先去把去年的 WWDC 提交的作品都看了一遍，apple 在 github 上维护了一份每年奖学金作品的开源项目集。

我花了差不多半天的时间粗略的看了一遍拿到奖学金作品的风格都是什么样的，发现呢其实 Apple 要的确实不是做的最精美的那一个，也不是所运用到的技术最深入的那一个，恰恰是能够带给人一些反思和引导的作品拿到奖学金的概率会更高一些。

![](https://i.loli.net/2019/12/13/5QIV8ORS3udKkMN.png)

我开始先用 Sketch 画了原型图，原型图并没有全部画完，不但因为时间不够而且做的东西也不太复杂，我做的是一个黎锦拼图的作品，我从外婆那拿了一件非常有黎族特色的衣服，衣服上织的是黎族的一个最有名的守护神——大力神，黎族人是一个崇拜大自然的民族，他们崇拜大自然的一切，比如风、雨、雷、电、水和火，甚至是牛等动物也是他们的守护神。

我用 iPad 上的 Procreator 复刻了这个守护神，黎锦有一个非常重要的特点就是对称美和运用了大量的色块，这种恰好就是拼图游戏的最佳落地。

在我的 playground 中，我提供了两种模式的游戏方法，第一种是跟着提示完成黎锦拼图，完成拼图后大力神会动起来；第二种是运用我重绘的一些非常具有黎锦特点的拼图元素进行搭建属于你自己的黎锦。

最开始的四五天，心情非常激动，每天很晚才睡然后很早就醒了，想多争取一些时间把作品完善得更好，但到了第八天的时候，整个人都不好了，已经完全不想再碰这个东西了，不想再多写一行代码，都是靠意念坚持下来的，去一次 WWDC 是我坚持下来最重要的力量源泉。

## 圣何塞我来啦！
后来呢，在 4 月 16 日凌晨五点我就醒了，因为那个时候已经是下午两点左右，大家都说 Apple 重新定义了 16 号，然后我就在迷迷糊糊中又睡过去了，然后在早上 7 点左右的时候我终于收到了心心念念的 Accept 邮件。

那一刻我真的从床上躺着直接跳了起来，但是因为舍友们都还没起床，强忍着告诉自己我不能喊出来。事后回想起来，准备作品的这几天应该是我大学最有价值的几天。

在接下里的时间里，我经历了很多个第一次，比如胆战心惊的去美国大使馆面签，被胖胖的可爱的黑人姐姐灵魂拷问 WWDC 是什么东西，然后因为真的太紧张了，居然一直绕在 “Apple，Apple，this is Apple...”这几个单词里出不去了。

最后在首都机场和来自其它地方的小伙伴一起踏上了前往圣何塞的飞机。

### WWDC 感受
因为在 WWDC 的这七八天时间里对于我来说还是像梦一般存在，原本想好好写一篇文章去讲述我在 WWDC 期间的所见所闻，但是在圣何塞的每一分钟对于我来说都十分珍惜和难忘，我还是没准备好怎么去面对那一段时间遇见的人和发生的事。

跟大家分享几个有趣的事情。

### Apple Staff 的热情
Apple Staff 的热情全程一丝未减，而且为了保持他们的尖叫热情，好多 staff 到后面嗓子都已经哑了，这跟我之前在国内所听到的说美帝人民工作和生活会分得比较开，比较中规中矩之类的，但这几天不管我在哪个场景下被服务，都非常非常意外。

### Yuma
应该 6 月 1 日儿童节当天下午是所有的 Scholar 在会场旁边的一个大草地上的聚会活动，我看到了 WWDC 的常客 Yuma，我没记错的话这应该是他的第二还是第三次，Yuma 一出现人群开始骚动，争先合影～

### 女性开发者早餐
虽然说 WWDC 的门票 1599 刀，转换成人民币一万上下，但会场提供的食物真的是难以下咽，后来我在几位之前小伙伴的带领下混入了女性开发者专场早餐，那里的早餐非常丰富，第一次去呢，我们几个是心理上的女性，第二次去我们几位小伙伴是心理上的黑人女性，第三次去我们变成了心理上的阿拉伯女性，以此类推，我们一直吃到了最后一天。

从这点可以看出 Apple 真的很正确，值得我们去反思一些东西。

### Bash
整个 WWDC 期间我觉得最嗨的环节就是 Bash，举办 Bash 的时间在周四晚上，基本上周四下午的 Session 结束后大家就早早的回去休息一下，然后直奔 Bash 现场，现场提供了无限量喝的与吃的。

有非常多吃的，而且味道都很不错，我最喜欢吃的就是这个炸饺子，感觉应该是叫炸饺子，配上各种酱，味道非常非常好。

加州的法律规定是未满 22 岁不能喝酒，而且 Bash 现场一人一次只能拿一杯喝的，但是没有规定不能替别人拿对吧。

然后我就和浩东两个人喝了八九杯，白的红的葡萄酒，喝到最后脑子很晕了，就和浩东两个人一起躺在草地上，旁边也是其它国家的 Scholar，大家一起打打闹闹嘻嘻哈哈，很有感觉，很棒。

我们应该是最后一批回去的，晚上快 10 点了，回去的路上给人感觉确实不太安全，老是能够问道刺鼻的大麻味道。

# 关灯游戏

接下来，进入到我们的今天的主角——SwiftUI。在我大一那会刚学 iOS 的时候，特别痛苦，一个看上去非常简单的列表，比如类似微信这样的列表，都弄了很久很久，因为 `UIKit` 框架的开发流程比较反人类，尤其是再以现在的视角去看，在 Web 技术的发展下，反向的刺激着客户端技术的前进。

SwiftUI 是 WWDC19 最引人瞩目的 framework 之一。SwiftUI 结合 Combine 使用「响应式编程」的思想去构建我们的 app，把触发页面刷新的数据源收敛到了一个点上，让我们只需要专注数据源的改变即可。

## SwiftUI

这次我们需要实现的游戏叫「关灯游戏」（名字是乱取的，我也不知道具体应该这么去称呼它）。具体的操作逻辑很简单，用户点击一个灯，会置反这个灯和它周围上下左右的四个灯的状态，玩家通关的唯一条件就是把所有灯都灭掉。

这个游戏我好早之前基于 `UIKit` 实现了一个 iPad 版本，对比了一下这个用 `SwiftUI` 实现的版本，发现代码量大大减少，而且逻辑十分清晰，游戏逻辑和 UI 切割得非常开，总的来说就是「这代码看起来真漂亮」。

接下来呢，我将分为 UI 和逻辑两部分去构建这个游戏。

......

## Combine
UI 实现好了以后呢，我们需要开始实现游戏逻辑。不管是做多复杂或者多简单的 app，我们一定要把握好一个度，就是 UI 和逻辑或者叫数据处理一定要分开，不能把 UI 和逻辑杂糅在一起，否则发展到后面会陷入一个泥潭，这也是我现在工作工程中每天都要遇到的问题（看情况展开）。

## 适配主机手柄

这部分内容结合以下几篇博客展开：

![Swift 游戏开发 - 序言](http://pjhubs.com/2019/08/29/swiftgame0/)

![Swift 游戏开发之「能否关个灯」（〇）](http://pjhubs.com/2019/09/02/swiftgame1/)

![Swift 游戏开发之「能否关个灯」（一）](http://pjhubs.com/2019/09/07/swiftgame2/)

![Swift 游戏开发之「能否关个灯」（二）](http://pjhubs.com/2019/09/14/swiftgame3/)

![从实际问题看 SwiftUI 和 Combine 编程](http://pjhubs.com/2019/11/09/swiftUIandCombine01/)

![如何为你的 iOS App/游戏快速适配主机手柄？](http://pjhubs.com/2019/11/30/swiftgame5/)

![为已有的 SwiftUI 代码适配 Apple Watch（〇）](http://pjhubs.com/2019/12/07/watchos01/)



# 总结
非常感谢能够来到北师大 iOS Club 与各位同学进行交流，同时我们学校信息科大也在筹办 iOS Club，这是我们学校 [iOS Club 的官网](https://iosclub.iflab.org)，上面会分享一些 Club 同学的日常学习内容，同时也希望北京地区的各个高校 iOS Club 能够多多互相交流。

最后呢，做点小广告，我所在的部门西瓜视频目前在开放了大量的 iOS 客户端实习、校招和社招的职位，北京深圳都可以，各位同学如果感兴趣的话，可以通过微信和我交流～
