玩转 Xcode 中的 Playground

13,576 阅读5分钟

WWDC18: 402: Getting the Most out of Playgrounds in Xcode

Swift 语言是苹果在 WWDC14 上正式发布的,与之同时发布的 Xcode6 中也第一次集成了 Playground 功能。两年后的 WWDC16 上,苹果发布了 iPad 专有的 Swift Playground 软件,帮助年轻人更好地学习使用 Swift 语言。今年的 WWDC18 上,苹果再次跟我们聊了聊“充分利用 Xcode 的 Playground 功能”。苹果如此不遗余力地推广 Swift 语言,如果这样还无法让你下定决心拥抱这门属于未来的语言,估计苹果也得急哭了。

更新不多,重点是机器学习

这次大会上发布的 Xcode 10中关于 Playground 的更新并不多,但有一个重点是 Playground 用来训练机器学习的模型,只要 import 新的Create ML 框架 即可。微博上已经有大佬玩了起来,看起来很厉害。

下面是 Xcode 10 中关于 Playground 的更新内容:

为机器学习量身打造的 Playground

  • 类 REPL 模式(Read-Eval-Print-Loop)可以快速重新运行已有的 playground 代码;
  • 运行指定行之前的代码,或者“shift+回车”运行刚写的代码;
  • Import 新的Create ML 机器学习框架 交互式地训练新的模型,在 playground 中写代码测试模型。完成之后,直接将模型运用在应用中。

关于 Create ML 框架这次大会上有一个单独的会场

基本功能

关于 playground 一些基本的介绍可以查看官方的帮助文档。 Playground 的一些基本用法包括Live ViewMarkup标记语言。

Live View

我们可以在 Playground 中可视化地查看自己的视图。实现起来也很简单:

import PlaygroundSupport
let viewController = /* 你的试图控制器 */

PlaygroundPage.current.liveView = viewController

可以使用 Live View 快速测试自己想要做的动画或特效。这种形式非常适合学习官方 API,或者制作教程。国外著名设计师Meng To 的《Design+Code》教程中的动画设计部分就是用 playground 写的,每一行代码产生的效果都可以直接在 Live View 中看到,十分直观。

Live View Demo

Markup

Playground 是支持 markdown 注释渲染的,只需要在单行或多行注释的后面添加冒号即可。某种意义上来说,你可以把 Playground 当成 markdown 编辑器来用。同时,Playground 还支持各种格式的资源,包括音频,视频,图片等等。而且,你既可以用标记语言引用这些资源,也可以用代码来引用。比如:

//  你可以用标记语言引用图片资源
 ![alternate text](MyPicture.jpg "hover title")
//  也可以直接用代码引用
 let image = UIImage(named: "image.jpg")

Playground 支持多页面,新建 Playground Page 即可。同时页面之间的跳转也十分简单,有三种方式:

[上一页](@previous)
[下一页](@next)
[指定页](PageName)

渲染起来也十分简单,打开右边栏,勾选“文件检查器”(file inspector)中的“Render Documentation”即可。

Render

详细的标记语言语法参见苹果官方文档。同时,苹果官方有一个 Swift 语言标准库文档的 playground 文件模板,可以参观学习一下,说不定我们也可以试试用 playground 写文档。

按步运行(Xcode 10 新功能)

按步运行是 Xcode 10 中的一个新功能,鼠标在 Playground 的代码行移动时,行号那一列会变成蓝色播放键。点击行号上的播放键即可运行当前行以上的代码(包括当前行)。

Blue button

已经运行过的代码播放键会变成灰色,如果鼠标所在行不形成一个完整的代码块(例如位于一个循环语句中)播放键也会显示为灰色。

Grey button

这里要注意的一点是,已经执行过的代码不会再次运行。如果需要再次运行,需要点击下方 Debug 工具栏的 Stop 按钮。 重置 Playground 之后我们会发现之前运行过的代码前面的行号重新变成了蓝色,即“可运行”的状态。

reset

那么在什么样的情况下建议使用 playground 呢?开发团队也给了建议:

  1. 自家 api 的按步骤的使用教程
  2. 处理一些数据的时候,比如地图数据,公开统计数据,班级作业等等
  3. 测试游戏 demo或者测试应用动画的时候

高级技巧

自定义显示类型

Xcode 9.3/Swift 4.1 中CustomPlaygroundDisplayConvertible替代了之前的CustomPlaygroundQuickLookable。可以通过CustomPlaygroundDisplayConvertible协议自定义 Playground 中的返回值显示类型。

extension MyType: CustomPlaygroundDisplayConvertible { 
    var playgroundDescription: Any { ... }
}

下面的这段代码把Pitch的返回值重新定义为一个视图。

import xxx

let pitch = Pitch(.a, 4)

// 自定义返回类型为视图
extention Pitch : CustomPlaygroundDisplayConvertible {
    public var playgroundDescription: Any {
    // 创建视图并定义视图属性
    let view = createView()
    
    view.noteNumber = noteNumber
    view.octave = octave
    view.customText = description
    
    //返回视图
    return view
    }
}

运行结果如下:

CustomDisplay

自定义类型可以是 Xcode 9.3/Swift 4.1支持的所有类型。

Support Types

Playground 中使用自定义框架

引用自定义框架的方法也很简单。如果是简单的一个框架,直接把 Playground 文件拖到工程中即可。

Single

如果是多个框架,把多个框架放在一个 workspace 里,然后再把 Playground 文件拖进去即可。

Multiple

引用框架直接 import 即可。

import

最后,开发团队的人说他们的愿景是:

明年,每个工程里面都有一个 Playground 文件!

你觉得他们的愿景会实现吗?


总的来说,Playground 的使用场景还是聚焦在学习和试玩的层面,毕竟交互式的界面设计可以让学习者很快看到自己代码的结果,这样反馈对初期学习是十分重要的。我们也看到开发团队也做了很多努力,让我们在 Playground 中的东西可以直接应用到正式工程中。

所以,就像第二位讲者说的一样,Playground 是个“有趣”(fun)的地方,但是它是“严肃的乐趣”(serious fun),因为里面的东西都是可以复用的。Xcode 的 Playground 是苹果给开发者的一片游乐场,可劲儿玩吧!

PS,下面是本文涉及到的 Xcode Playground 的相关资源:

  1. Github 上一个收集各类优秀 Playground 的 Repo
  2. 苹果官方 Xcode 帮助文档
  3. 苹果 Markup 语法文档
  4. 苹果 Swift 语言标准库文档的 Playground 文件模板