大多数浏览器和
Developer App 均支持流媒体播放。
-
Swift Playgrounds 3
Swift Playgrounds 3 简介:适用于 iPad 的开创性 app 的最新版本,让 Swift 编程充满互动和乐趣。探索如何利用自己的 Playground 来快速迭代使用设备功能的代码。了解新的模块功能如何既能帮助您整理自己的代码,又能为 playground 图书作者提供新的机遇。
资源
-
下载
大家好 欢迎参加 Swift Playgrounds 3演讲 我是Grace Kendall 我是Joy Forbes 我叫Jonathan Penn 我们都是Swift Playgrounds的 软件工程师 今天能来到这里 我们感到非常激动 我们要与你们分享使用Swift的 新功能在iPad上创建新想法 我们会演示一些技巧 关于创建更具吸引力的体验
Swift Playgrounds 是一款app 你可以编写Swift代码 并了解其他作者所创建的内容
你所编写的代码是真正的Swift 由app进行编译 并在iPad上运行
你所创建或下载的 Playgrounds 显示在你的文档列表中 如图所示
底部的 “更多Playgrounds” 显示与你所创建的内容相似的 其它Playgrounds 如果你轻触“查看全部”按钮
你会看到可以 从Apple下载的全部内容 以及你所订阅的其它feeds 你还可以在底部的“其它发布商”中 浏览特色订阅
Apple在Swift Playgrounds 3中 发布了六个新内容
Learn to Code家族又扩展了 Lights、Camera、Code、 Assemble Your Camera 和Flashy Photos 这些与起初的 Camera Create一起 介绍了用组件进行创建的概念 从而创建比如摄像头 和照片编辑器一样的功能
Sonic Workshop挑战 和Sonic Create起点 在iPad上使用触摸事件来作曲 并创建可视化声音图
今天我们将了解 Swift Playgrounds 3中的 一些很棒的新功能 我将介绍你在iPad上 所能做的开发 然后Joy再讲Mac上 对作者们可用的一些新功能 但首先Jonathan 会给我们做演示 举例说明Swift Playgrounds 3 为开发者们所提供的功能 Jonathan? 谢谢Grace
我要演示作为想法的暂存器的 这个工具有多么强大 还带点乐趣 这些设备非常漂亮 我个人非常喜欢它的传感器 比如加速度计 我个人是那些使用加速度计来实现 很酷的操作的游戏的狂热粉丝 那可以带来一种真实的感觉 关于屏幕上正在发生的事 我要给你演示 我从零开始在iPad上创建 无限滚动大理石障碍赛的一些步骤 完全在Swift Playgrounds中实现 不知道你是否玩过其中一种 解谜小游戏 就是你得滚动大理石 不要让它掉进任何洞里 就是类似那样的游戏 我们需要一些东西才能实现这种功能 比如响应iPad倾转动作的大理石
我们需要程序性的生成洞的地图 从而玩家可以引导大理石绕过 为了让事情简单一些 我们的目标是尽可能远 尽可能快 而不会掉进洞里 或落到路线外面
创建类似这样的功能 需要好多步骤才能实现 我主要讲其中的几个步骤 当然了 我要使用 Swift Playgrounds
读取原生加速度计数据 试验在线结果 使用实时视图了解物理引擎中的 SpriteKit 并试验如何在整个跑道上实现这个 程序化的生成和布局洞 然后我们要把它们组合在一起 并查看完整的原型 让我们开始吧
好吧 让我们从空白页开始 Swift Playgrounds 文档中的每一页 都是自己的执行输入点 是个main.swf文件 我喜欢使用独立的页面 就像是我的旅行日记一样 我要尝试解决问题 或学习新API 只是为了把东西做出来 我要从一个子系统开始 或从一个函数开始 或从这里开始 然后在移到新页面上 这是一张完全空白的页面 我可以继续下一个想法 留下一条我可以返回去 进行进一步实验的线索 现在我们的首席技师是 iPad的倾转动作 我们很可能应该 从导入CoreMotion开始
我们要创建 CMMotionManager 现在我使用硬件键盘上的Tab键 从底部的这个快捷方式中 选择不同的选项 用于代码完成 然后我要按回车键选中它
我们通过startAccelerometerUpdates 启动管理器
现在我不知道你是谁 但我从未记得 加速度计的哪些xyz坐标 响应iPad 应该要如何在这个方向移动 我总是感到很困惑 但 嘿 让我们就在这里解决它
在我们开始之前 我们要等一小会儿 加速度计需要一些时间才能运转起来 我们担心稍后要定期读取 加速度计的数据 目前我们只想试验 看我们是否能取出它的值 因此我要告诉管理器 我想获取加速度计数据、 加速度属性和x坐标 把它放在它自己的行上 这个行就被记录在案 表达式也被记录在案 并在右手边返回内联结果 我们可以在这里看到 当我轻触“运行我的代码”时
全部四行代码得到了一个内联结果 我要轻触代表最后一行的 最后一个图标 嘿 我们看到了一个值 负0.78 那代表了-某些东西 嗯 让我在这里试一下这个 我要倾转iPad并尝试再次运行它 看看现在有什么值 它说 嘿 负0.061 数值不一样了 在这里的某个地方 我们得到了某种反应 我认为这与iPad的移动相关 这是一个开始 但我很想获得某种实时反馈 告诉我正在发生什么 因此让我们快速进入下一页 我准备了一个例子
通常当你运行 Playground页面时 程序计数器到达最末端后 执行就会停止 无论何时你都可以轻触 “运行我的代码”重新执行代码 这在很多情况下都很有用 但在这个例子中 我希望能继续执行 从而我可以随时间收集值 为此 我要使用 Playground Support API 告诉当前页面我需要无限执行 我们像以往一样创建 CMMotionManager 我们启动加速度计 我在这里写了一个简单的函数 只是个helper函数 叫做repeatEvery 它接受一个后置闭包 立即调用闭包 然后在给定的时间间隔之后 安排再次调用它 通过在主调度队列上使用 asyncAfter方法实现 这是一种简单的重复方式 我知道 但你知道吗 我们只是在试验 它用起来很棒 无论在这个页面上的任何位置 只要我需要 我就可以重新使用它 并且我要在这里使用它 每隔半秒钟 就调用这个后置闭包 并且只要加速度计数据不为无 我们就使用这行上的表达式 来记录x坐标 让我们看一下当我轻触 “运行我的代码”时会发生什么 好吧 屏幕上正在进行 让我轻触内联结果 看看这里会发生什么 自动为我们选择了图表呈现 因为这是一系列简单的数值 我要拿起它并四处移动 哇哦 我们有值了 有东西了 好吧 我要尝试在这里获取一个基线 我要把它平放 然后我再垂直倾转它
我要把它向下倾转 好的 我认为我们已经搞定了 加速度计的x坐标 响应iPad沿这个轴 在这个方向上的移动 好吧 我们开始吧 我可以做同样的操作来了解 y轴和z轴是如何运作的 这非常有用 这个repeatEvery函数-
谢谢
这个repeatEvery 函数很好 虽然很粗糙 但很简洁 很清楚 我要把它用在其它地方 直到我了解如何正确处理它 没关系 因为我在Swift Playgrounds 3中 把它创建为一个空白的Playgound 我可以使用新的选项卡式编辑 让我来演示一下 我要轻触上边导航栏中的 “文件”图标 然后我要轻触“实用程序模块” 这会打开用户模块和源文件选择器 你可以看到因为我要实现这个想法 我已经在这里克隆了许多东西 嗯 在“实用程序模块”中 我要把那个函数放在这里 做一个 Timing.swift文件
我要轻触“选项卡” 返回页面的主文件 我要轻触repeatEvery 函数以选中它 如果我轻触并按住 我可以拿起它 我用另一只手轻触“计时选项卡” 然后松开手 那会复制这段代码 并把它释放到这个文件中 因为这是个新文件 Swift不知道什么是时间间隔 或调度队列 我要通过导入 Foundation来告诉它 从而它就了解如何处理那些符号 因为我想在每个页面上的任何地方 使用这个函数 甚至可能在其它模块上使用它 我需要把这个函数标记为公共函数 因此它总是可见 现在我可以返回到主文件 轻触以选择函数、删除它 如果我做的对 一切都应该没问题 好吧 我们开始吧 耶 现在我可以按需要打开文件了 从而试验不同的想法 比如让我们在这里尝试一下这个 Math.swift 当我正在执行的时候我要丢掉 一堆东西 只是为了帮我试验 这些是数学helper函数 和对系统类型的一些扩展 可以让编写代码变得更流畅 当我把它作为过程的一部分使用时 我可以轻触并拖动以重排序选项卡 轻触“关闭”按钮以关闭选项卡 所有这些代码 在这个文档中的任何地方都可用 非常方便 现在让我们加快一些进度 我一直在用 SpriteKit四处查看 从而回顾它是如何运作的 让我们看看我的下一页进展怎么样了
我需要为 SpriteKit提出文档 我通过轻触导航栏中的 “工具菜单”图标 并选择“文档”来实现 我通过轻触放大镜搜索文档 并搜索SpriteKit 通过阅读这些内容 我就可以回想起来这个是如何运作的 如何创建屏幕左手边的代码主体的 我了解了 SpriteKit的场景和节点 SpriteKit通过在游戏中 安排一切并在屏幕上进行渲染 我了解了物理引擎 以及如何对节点施加力 从而使物理机制随时间的推移 开始运作 并且我了解了SpriteKit 在每帧上回调我的代码时的游戏循环 从而我可以影响环境的变化 最后一点非常重要 让我关闭侧边面板并打开底部的 “执行控制菜单” 因为SpriteKit在每一帧上 都回调我的代码 我必须得快点 我要关闭内联结果 正如我们所看到的 它们在许多情况下都很有用 但记录那些表达式却需要时间 我不想在这种情况下减慢 SpriteKit的进度 并且我甚至都不需要它们 因为你可以看到 当我轻触“运行我的代码”时 我把SpriteKit 设置为实时视图 SpriteKit自身会给我提供 我处理这部分时所需要的反馈 就是这样 我们有一个圆形的物质 正在四处移动 以响应iPad的倾转 好吧 现在重点来了 因为… 谢谢…
一旦你得到了这样的东西 一旦你在屏幕上得到了正在运行的 这种内容 你会拿着它去做用户测试 对吗? 因此我要把它拿给我的孩子们 我告诉他们说 嘿 你想看一些很酷的东西吗 他们打断了我 从我手上 拿走iPad 然后开始看它 倾转iPad看它在屏幕上四处移动 他们觉得有意思 他们说“这很棒 爸爸 这非常棒
但好像缺点东西 你看屏幕上并没有足够多的大理石 我们需要更多大理石 许多许多大理石”
他们有做项目管理的天赋 好吧
这和我的最终目标没有任何关系 但那听起来确实很酷 我们应该有更多的大理石 因此我增加了轻触 只是为了识别她 和他们坐在一起 我们一起实现了这个功能 每次你在屏幕上轻触时 我们都向场景中插入一个 新SpriteKit节点 并把它添加到物理引擎中 从而它可以加入这里正在进行的 有意思的比赛 通常是这样的 孩子的年龄越小 他们的轻触就越猛烈 从而尝试尽快把屏幕填满 并且他们想看看它是否会崩溃 它没有崩溃 然后他们就会把这东西弄走 然后各种摇晃 我不说谎 我真的觉得这非常有吸引力 我可以看一下全部…
我稍后再做
我建议你们也这样做 很放松 那么无论如何 我们现在有SpriteKit了 它正在执行某些操作以响应加速度计 这些操作就是倾转iPad 已经很接近了 我们了解了一些这个游戏的运作方式 并且它会变得越来越刺激 但现在我需要了解如何实现 这个程序性的洞的生成 请记住 这是一个分布着洞的路线 大理石应该穿过路线并绕过洞口 我们很可能希望记住 我们放置洞口的位置 因此如果用户恰好由于某些原因 向后滚动 他们可以重新路过 他们之前见到过的洞口 让我们继续看一个试验 当创建这个页面时 我决定进入我的游戏模型模块
并创建MapStruct 这个类型的目标是 随着你穿过路线 计算并记住洞的位置 它其实是把地图分成了几个栏 然后再把洞口安置在栏里边 非常简单 如果我想 我可以用一些更复杂的东西来交换它 额 它现在能用
同时在游戏引擎模块中 我创建了一个MapNode 它接受一个地图 并了解如何沿着路线在不同的点上 布局洞口节点 你所要做的就是给它传递一个长方形 代表摄像头所在位置 和用户所看到的视区的长方形 一旦你这样做了 它就会渲染那个点中的洞口 如果必要的话就重复使用节点 它有点像UI表视图之类的东西 让我运行这里的代码 看看这是如何运作的 右手边有一些内联结果 我要轻触以浏览预览 我在MathNode上 自己编写了这个预览方法 因为我想生成SKView UIView子类显示 SpriteKit场景 我想生成它并把它放在这里 从而它只显示为静态内联结果 我不需要创建任何额外的东西 来显示它 它就在那儿 已经准备好了 现在我们看到 如果整个直径的宽度为20点 并且我们正处于路线中的这个点上 这是你将得到的地图密度 我可以按我的意愿试验这个密度 并调整这里的值 进入其它文件并调整那些值 内联结果为我提供了我在这个点上 所需要的这个反馈
现在我已经准备好了 让我们再往进一步 跳到最后一步
我们可以看到这个游戏 在我开始之前 我必须再次关掉内联结果 和之前一样 我们在每一帧上都做大量的工作 我们不需要记录表达式 我们不想减慢我们的进度 我要轻触“运行我的代码” 就在那儿 我们有个看起来像是大理石一样的 东西 在看起来像是墙壁一样的东西的顶部 有视差 看起来就像这样 很漂亮 当我在实现这个想法时 Joy提醒我说我可以从模板中 取出大量纹理 你可以直接从app中下载 你知道的 取出那些资源并充分利用它们 因此我拉出传感器 使用资产选择器创建模板 取出其中一些纹理 并把它释放到我的app中 它们在这里 我甚至还查看了… 一个图像编辑app以查找… 做一些看起来模糊的洞口形状的东西 哦 没关系 径向渐变看起来很不错 很酷 在这里 让我轻触屏幕中央 让它变成全屏 通过把中心点一直拖动到左边实现 我要再试一下这个 我添加了轻触识别器 如果游戏结束 可以重新开始 让我们看看我目前进度怎么样 你的速度越快 分数增加的也越快 给这里的乐趣增加了一些鲁莽的因素 哇哦 好的
在这么多人面前实现这个想法 很困难 但 嘿 你知道吗 你在这里所看到的一切 到达这一点的每一个步骤都完全是在 这台iPad上实现的 这非常有意思 我的家人玩这个玩得很好 我更加了解了SpriteKit 我有机会在app中使用新用户模块 和源文件支持 从而把我要实现的东西 分成不同的步骤实现 这是非常奇妙的体验 iPad上的 Swift Playgrounds 是一个非常好用的暂存器 用于尝试实现你的想法 也许甚至了解并使用我们的API 从而了解它们是如何运作的 或甚至是增加你生活中的压力 通过创建速度运行游戏 并和你的朋友们一起玩
现在我要邀请Grace返回舞台 她会讲这是如何运作的 并深入地讲如何使用这些新功能 来充分利用 Swift Playgrounds 3 谢谢
谢谢Jonathan
如果你已经熟悉 Swift Playgrounds了 你可能已经在Jonathan 的演示中注意到了一些新功能 现在让我们看一下那些新功能
最显著的是模块的添加 可以让你把你的代码分成多个 Swift文件
模块表示为Swift代码目录 可以在书中的任意页面使用 你不需要担心设置目标 或开发新创建设置
用户可以向书中添加模块 并向任意模块中添加Swift文件
然而请注意 如果你重设了文档 那么所有用户编辑也会被重设 这确实包含所添加的任意文件或模块
所以通过所有这些新文件 我们可以了解一下 Playground的结构 我要使用“形状”模板作为例子
每本书都有许多页
每本书还可以有多个模块
这些模块中的每一个也都可以 有多个源文件
让我快速讲一下 这些不同的Swift 文件之间的访问级
每本书内一张页面上的代码 不与其它页面共享 也就是说“画布”页面上的代码 与“创建”页面上的代码不共享
然而每个模块都自动导入到 每个页面中 这意味着每个页面上都能访问 你模块中的代码 只要那个代码被标记为公共代码即可
同一个模块中的文件可以相互访问 而不需要把代码标记为公共代码 然而如果代码被标记为私有代码 它将对其它模块或页面中的其它文件 不可见 它仅为那个文件所私有
默认情况下 模块之间的代码不共享 但假如我在“图形”模块有一些代码 我想在我的 Calculus.swift文件中引用 那个文件在我的“数学”模块中 我所要做的就是确保“图形”代码 被标记为公共代码 然后把“图形”模块导入到我的 Calculus.swift文件中
通过模块 你仍然可以访问内联结果 和分步执行 因此你可以观察代码在全部文件中 所采取的路径 当app分步执行代码时 它会自动切换正在执行代码的文件
你还可以关掉内联结果 那会加速执行速度 我们已经在 Jonathan的演示中看到了 你可以从“执行控制菜单” 找到这个控制 以及“分步执行我的代码” 和“缓慢分步执行”
新的“问题”弹出框可在一个文档中 给你显示所有文件中的错误 并可以让你轻松地 在这些错误之间导航
如果你轻触任何一个错误 它会把你带到相应的代码行 既包含创建错误 又包含运行时错误
Swift Playgrounds支持Swift 5 和iOS 12.2 SDK 这可以让你使用这样的框架 比如Core ML 2和ARKit 2 直接在iOS上做iOS开发
一切都来自一个空白的 Playground 你可以通过“目录”弹出框添加页面
添加模型
并向那些模块中添加源代码文件 而不需要离开app
还有许多自定义你的内容的方式 比如设置模块模式、 添加可本地化的代码注释 并当用户打开你的文档时 修改用户所能看到的文件 接下来我想邀请我的同事Joy上台 为大家讲如何实现
谢谢Grace
接下来让我们讲一下作者们 可以在Xcode中 进行自定义的新功能 无论你是直接共享 你的Playground 或是通过订阅实现
当我在教学时 重点是我给学生们所提供的工具 要选择恰当并尽可能具有用户友好性
为了给拥有不同知识储备的你们 创建合适的工具 在Swift Playgrounds 3中 有一些功能 你可以用于突显你的 Playground中最重要的部分 并移除不必要的复杂的东西 这些新功能可以帮助你们创建 更吸引人的内容 并为初学者在实际的开发工具中 提供一种非常友好的体验
首先让我们看一下模块模式 你已经听到许多关于app中的 模块模式了 Jonathan和Grace 都提到过 作为作者 你可以决定哪个模块模式 适合你的书 因为所有模块都是一个新功能 并不是所有的书都受益于模块的使用 为此 我们有三种模块模式 分别是无、受限和全部 你所选择的模块模式 将从根本上改变你的书的性质 应该被视为用户体验的基础
让我们先看一下“无”模块模式
这种模式为学生们提供了一种 原始Playground体验 不允许访问用户模块 这种模式完全依赖于页面和章节 用代码推进故事 每个页面都完全独立 因此在页面之间不会以任何方式 共享用户代码
在“无”模块模式中 你书中的所有代码都将进入 模块文件夹 这将创建私有模块 并在Playground 书中引用它 而你的学生们不能编辑它 你可以在三种模式的任意一种模式中 使用私有模块 然而“无”模块模式的区别在于 你的全部代码都将进入私有模块
在你创建书时 请记住对页面和章节的体验 应该是线性体验 作为作者 你应该考虑 每一个页面的目标 并让每个页面都实现一些你能实现的 新功能或在能实时视图中看到它们 这将为学习者提供一个紧密的 反馈循环 确保他们了解他们已经完成了任务 他们已经准备好继续了
要浏览这本模块模式书的 模块模式的示例库 请查看 Learn to Code 1、 Learn to Code 2、Lights、 Camera、Code和各种挑战
“受限”模式是你初次涉足用户模块 和共享文件的模式 “受限”模式只限于单一用户模块 与私有模块不同 你的学生们完全可以编辑用户模块
用户模块中共享的文件 在整本书中都可用 并且随着时间的推移 共享文件可以用来构建代码 访问单一模块 你的学生们可以学习如何管理 来自他们不一定打开过的文件中的 多个文件和错误
在你的一个模块内 你可以想提供多少共享文件 就提供多少共享文件 你的学生们可以在他们的用户模块内 编辑、创建或删除 任意共享文件
作为作者 你还可以使用私有模块
在模块目录中 包含你不想让学生们编辑的API
正如你在Jonathan的演示中 所看到的那样 他向单一Math.swift 文件中添加了一些数学函数 添加新的共享文件是学习的好机会 学习如何教学生们 如何以逻辑方式管理代码
你可以教你的学生们 把代码移动到一个共享文件中 他们会在多个页面上建立起来 或移到不经常更改的代码旁边
要浏览受限模式书的示例库 你可以查看Blu's Adventure、 Assemble Your Camera Flashy Photos 和各种挑战 你在这里看到了其中一些挑战
如果你想要全部附加功能 你可以用“全部”模块模式 这个模式为你提供全部可用的工具 包括创建多个模块以及在这些模块内 创建新文件
这个模块适合教代码架构和管理 在“全部”模块模式中 你不仅可以教如何管理多个文件 还可以教如何管理多个模块 以及如何把模块导入到其它模块中 如果必要的话
在“全部”模块模式 你仍可以使用私有模块 并可以拥有许多预创建的用户模块 你想要有多少就有多少
“全部”模块模式也为学生们提供了 一定的自由度 他们可以扩展那些用户模块 并创建他们自己的用户模块
当你创建模块时 你应该考虑何时想要使用私有模块 以及何时使用用户模块
通过把全部代码放到用户模块中 你的学生们可以轻松地在你的 Playground中四处浏览 从而了解它是如何创建的 这还可以让他们完全控制修补工具 和混合工具 可以让你的学生们超越 作为学生的身份
更加靠近他们的目标 即成为一名app开发人员
要浏览“全部”模块模式书的示例库 请查看任意起点
要指明你想让你的书归入哪个 模块模式 你必须在书一级的清单中编辑 UserModuleMode密钥
你可以实现的另一个自定义是 当在“受限”和“全部”模式下 使用模块时 会按页面自动打开并激活 页面上的文件
你可以在选项卡式编辑器中 暴露多个文件 你可以指明要打开哪个文件 以及当你到达页面时要激活哪个文件
要添加开放文件意味着 main.swift将作为激活文件 但编辑器中可能有其它文件 作为选项卡打开了 当用户到达页面时 为他们提供打开的共享文件 可以帮助他们了解他们要编辑 哪个文件 或需要引用哪个文件 而他们不需要自己在文件弹出框中 定位那些文件
你可以在页面级的清单中 按页面指定所打开的文件
在清单中 使用UserModuleSourceFilesToOpen 密钥
接着是共享文件的数组 每一项的值都应该是所共享的 文件的相对路径
在任何情况下 你有开放文件时 默认动作是main.swift 为最前面的文件或激活文件
然而如果其中一个共享文件 是你的用户要处理的 第一个或最主要的文件 当用户到达这个页面时 你可以把这个文件设置为激活文件
要声明共享文件为激活文件 要在页面级的清单中再次使用 UserModuleSourceFileToActivate密钥 这个密钥的值是 到单一共享文件的路径
你总是会在主文件中执行代码完成 在Swift Playgrounds 3中 让我们看一下如何对共享文件 扩展了代码完成
代码完成指令决定了 在快捷方式栏中所暴露的API 快捷方式栏是一个很有帮助的工具 可以追踪学习者 最小化他们必须键入的时间 并确保他们总是知道下一步要做什么 在介绍性内容中 你想减少录入的障碍 通过让学生们 轻触他们的大部分代码实现 在更高级的内容中 你想在何时的时候暴露API
作为作者 你可以按页面控制在 主文件和共享文件中的 快捷方式栏中显示哪些API
为了管理这些完成 Swift Playgrounds 提供了两个地方 你可以在这两个地方提供 代码完成指令
先看一下你可能熟悉的一个地方 即在main.swift文件中
如果你在新内容中没有任何 代码完成指令 这就是你首先会看到的内容 Assemble Your Camera
为了确保你可以完全控制 在快捷方式栏中显示什么 你可以先从这个指令开始 everything hide 正如它的名字所暗示的那样 这会隐藏快捷方式栏中的一切 这会为你提供一个白板
要把创建建议放回到快捷方式栏中 你可以使用 currentmodule show 这是一个特殊关键字 用于确保在主文件中显示 你或你的学生们所创建的一切
指令模块后面 是一个用逗号分隔的模块列表 那会显示用户模块文件中 一切被标记为公共的内容 以及用户在使用Playground时 所编写的任何新代码
这与你用来暴露库 比如UIKit的 指令是同一个指令 要获取关于各种指令的更多信息 请查看 Swift Playgrounds文档
在Swift Playgrounds 3中 新添加的功能是 如何在页面级清单中向共享文件中
添加代码完成指令
这意味着就像 当学生们翻阅你的书时 你如何指定在主文件中 暴露哪个API一样 你也可以在共享文件中 实现同样的操作 确保你不会让学习者们 在旅程开始时负担过重
为此你可以使用密钥 UserModule CodeCompletionDirectives 然后是代码完成指令的一个数组 类似于你在主文件中的操作一样
如果使用 everything hide 你将可以使用currentmodule show 和module show 在主文件和共享文件中显示 所创建的一切内容
此外你还可以添加关键字作为标识符 比如公共和私有 从而当学生们开始在共享文件中 学习新函数、新类和新结构时 把这些呈现给它们
接下来让我们谈谈在Swift中 制作过场动画
Swift Playgrounds 书库中的一些书 使用过场动画来介绍新技术、 吸引用户或总结概念
之前只能用HTML实现 现在你可以在Swift中编写了
这就为你 为开发者提供了许多好处 你可以利用一些框架 比如SpriteKit、 UIKit和CoreAnimation
通过使用Swift 你不需要切换工具来创建过场动画
那意味着你可以使用界面创建器
来创建Storyboard 和自动布局
你可以本地化你的过场动画 所使用的工具与你本地化你的内容 所使用的工具相同
你可以使用Swift 向你的书中添加过场动画 与添加新页面的方式类似
在页面文件夹中 你仍需要一个以.cutscenepage 结尾的文件夹 只有现在你才既需要 .swift文件 又需要清单 你所包含的.swift文件 与liveview.swift文件一样 应该运行并呈现一个实时视图
为了让你的过场动画在目录中显示 你要把它添加到章节级的清单中 就像添加新页面一样
最后我要非常激动地给你们介绍 本地化代码注释
如果你把Playground书 分发到多个地方 你现在可以在任意主文件 或共享文件中本地化代码注释了 这意味着你的书将对学生们进行 完全本地化
对于代码注释 你可以在可本地化区域 包装单一或多个注释 每个可本地化区域都应该有一个 唯一标识符
你还可以使用内联可本地化区域 让字符串从字面上可本地化
你的本地化代码注释的输出 将被存储在 LocalizableCode.strings文件中 这个文件位于书一级的 私有资源文件夹中
这只是Swift Playgrounds 3中 为作者提供的强大的新功能中的几个 接下来让我们结合Grace的演示 看看所有这些新的作者和app功能
通过所有这些新功能 我真的很想炫耀一下 你可以在iPad上创建 超级强健和有意思的 Swift Playgrounds
你们都知道 在iPad上创建集成iOS 摄像头的app的一般流程 是从Mac上的Xcode中的 空白app开始 编写一些代码 在iPad上运行代码 看是否生效 然后在两台设备之间来回迭代 但你可以更迅速地迭代 如果你就在iPad上 使用Swift Playgrounds 编写代码的话
我想使用Vision框架 它使用摄像头和Core ML 来执行对象检测和实时捕捉 Swift Playgrounds 实际上是我创建这个功能的完美场所
在美式手语中有一个概念 是名字手语 是唯一标识某个人的特殊手语
我小时候 我妈妈给了我这个名字手语 是字母G和一个微笑 但左边那个不笑的人是我 也许应该更像这样
为了实现这个想法 我创建了一些内容 集成了一些涂鸦和一些手语识别 我现在想展示给你们看
好吧 这就是我的内容 打包到了一本书中 书名是《Sign Me Up》 我想要做的就是 让Jonathan、Joy和我 给自己创建独特的面部彩绘 然后用手语触发那些绘画 我正在做触摸识别 从而绘制实时视频输出 然后我要使用Vision框架 来追踪绘制用于检测面部 然后我要使用Core ML来执行 对象识别和实时捕捉 从而根据手势切换绘制
我创建了我的书 并把它放在“受限”模式下 因此我可以隐藏某些实施细节 我其实只想让我的用户关注 我在用户模块中所创建的 某些Swift文件
我在Mac上培训了一个 Core ML模型来识别三个手势 分别是G、Y和N 然后我把模型导入到iPad上的 这个Playground中 G代表Grace 而我的搭档 Jonathan和Joy 他们的名字头两个字母一样 所以我选择了第三个字母 Y代表Joy 而N代表Jonathan 我想邀请他们俩上台来做演示
好吧 在第一页上 我添加了一些描述 告诉用户做什么 当Joy轻触源文件编辑器时 你会看到我已经添加了一个 代码完成指令 用于推荐setColors函数
只需要轻触 她就可以通过在代码完成栏中 选择颜色文字占位符来填写这个函数 这个快速编辑器使这样查看 UI的不同颜色变得超级简单
setColors函数设置了 一些不同的绘制颜色 一旦她运行代码就会变得可用 让我们继续并操作一下
太棒了 让我们把实时视图展开为 全屏显示 从而更好地查看它
她会循环通过底部 左下角 设置Y代表Joy 然后她可以轻触右下角 选择要绘制的颜色 然后她可以做一些面部彩绘
她所绘制的内容 会通过Vision框架 追踪到她的面部 那会返回面部轮廓以及一些面部特征 我要使用左侧瞳孔把所有这些点 都映射到它们的正确位置上去 一旦她满意了 她可以轻触完成 然后就轮到Jonathan了
然后这些绘制就被呈现为 一组颜色和距离 左侧瞳孔的x-y距离 然后被映射到一个字母 然后把这个信息保存到 这个Playground的 Playground键值存储中 用于映射的所有代码都在 FaceView.swift文件中 并对用户可用 可以让用户细读 而不会弄乱主页面 看起来Jonathan已经完成了 我也照着做
酷
太棒了 现在让我们进入下一个页面 这个页面指导我们运行代码 并查看会发生什么
让我们再次全屏显示实时视图 从而可以更好地查看它 目前 除了面部识别什么都没发生 但请试着比划字母Y
太棒了 Swift Playgrounds 正在识别
是的!
Swift Playgrounds 识别手势Y代表Joy 并把她的绘制投射到她的脸上 让我们看一下如果我们尝试比划 不同的字母怎么样 试试字母G
-哦 我不知道 -稍微旋转一下
我们马上就成功了 也许试试代表 Jonathan的字母N 这就对了 酷 酷 它甚至可以切换面部
完美 你看起来从没这么漂亮过
所有这些代码完全都是 在iPad上的 Swift Playgrounds中 编写并运行的 并且你可以对学生们、 朋友们或Mac上的搭档 自定义这些代码 制作独一无二并且非常有意思的内容 那可以让Swift Playgrounds 更易于接受
你可以在线下载Jonathan的 和我的Playgrounds wwdcswiftplaygrounds2019.github.io 订阅中有 要获取更多信息 请查看 developer.apple.com上的文档 欢迎参加明早举办的演讲 时间是早上9点 我们都会参加演讲 我们期待与你们交谈
非常感谢你们的参与 祝你们好好享受余下的大会时光
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。