PLAYGROUND 可视化

由 王巍 (@ONEVCAT) 发布于 2015/09/23

在程序界,很多小伙伴都会对研究排序算法情有独钟,并且试图将排序执行的过程可视化,以便让大家更清晰直观地了解算法步骤。有人把可视化排序做得很正统明了,也有人把它做到了艺术层次

想在 Cocoa 中做一个可视化的排序算法演示可不是一件容易的事情,很可能你会需要一套绘制图形的框架,并且考虑如何在屏幕上呈现每一步的过程。但是在 Playground 中事情就变得简单多了:我们可以使用 XCPlayground 框架的 XCPCaptureValue 方法来将一组数据轻而易举地绘制到时间轴上,从而让我们能看到每一步的结果。这不仅对我们直观且及时地了解算法内部的变化很有帮助,也会是教学或者演示时候的神兵利器。

XCPCaptureValue 的使用方法很简单,在 import XCPlayground 导入框架后,可以找到该方法的定义:

  1. func XCPCaptureValue<T>(identifier: String, value: T)

我们可以多次调用该方法来做图,相同的 identifier 的数据将会出现在同一张图上,而 value 将根据输入的次序进行排列。举一个完整的例子来说明会比较快,比如下面的代码实现了简单的冒泡排序,我们在每一轮排序完成后使用 plot 方法将当前的数组状态用 XCPCaptureValue 的方式进行了输出。通过在时间轴 (通过 “Alt+Cmd+回车” 打开 Assistant Editor) 的输出图,我们就可以非常清楚地了解到整个算法的执行过程了。

  1. import XCPlayground
  2. var arr = [14, 11, 20, 1, 3, 9, 4, 15, 6, 19,
  3. 2, 8, 7, 17, 12, 5, 10, 13, 18, 16]
  4. func plot<T>(title: String, array: [T]) {
  5. for value in array {
  6. XCPCaptureValue(title, value: value)
  7. }
  8. }
  9. plot("起始", array: arr)
  10. func swap(inout x: Int, inout y: Int) {
  11. (x, y) = (y, x)
  12. }
  13. func bubbleSort<T: Comparable>(inout input: [T]) {
  14. for var i = input.count; i > 1; i-- {
  15. var didSwap = false
  16. for var j = 0; j < i - 1; j++ {
  17. if input[j] > input[j + 1] {
  18. didSwap = true
  19. swap(&input[j], &input[j + 1])
  20. }
  21. }
  22. if !didSwap {
  23. break
  24. }
  25. plot("第 \(input.count - (i - 1)) 次迭代", array: input)
  26. }
  27. plot("结果", array: input)
  28. }
  29. bubbleSort(&arr)

因为 XCPCaptureValue 的数据输入是任意类型的,所以不论是传什么进去都是可以表示的。它们将以 QuickLook 预览的方式被表现出来,一些像 UIImageUIColor 或者 UIBezierPath 这样的类型已经实现了 QuickLook。当然对于那些没有实现快速预览的 NSObject 子类,也可以通过重写

  1. func debugQuickLookObject() -> AnyObject?

来提供一个预览输出。在上面的冒泡排序方法中,我们可以接收任意满足 Comparable 的数组,而绘图方法也可以接受任意类型的输入。作为练习,可以试试看把 arr 的全部数字都换成一些随机的字符串看看时间轴的输出是什么样子吧。

PLAYGROUND 可视化的更多相关文章

  1. 0、PlayGround可视化

    Tensorflow新手通过PlayGround可视化初识神经网络 是不是觉得神经网络不够形象,概念不够清晰,如果你是新手,来玩玩PlayGround就知道,大神请绕道. PlayGround是一个在 ...

  2. Swift开发学习(两):Playground

    Swift开发学习:Playground 大约 对于软件用户.游戏玩家,我一直提倡用户体验.也是用户,是各种开发工具的使用者.也会喜欢用户体验做得好的工具软件.这次苹果想开发人员所想,提供了一个能够玩 ...

  3. Swift开发学习(二):Playground

    http://blog.csdn.net/powerlly/article/details/29674253 Swift开发学习:Playground 关于 对于软件用户.游戏玩家,大家一直都在提倡用 ...

  4. 1.UI初认识

    前节:app是什么? app英文全称:application 应用程序,简称应用.也就是手机应用的简写 出处:http://www.cnblogs.com/mcj-coding/p/5098254.h ...

  5. 推荐!PlayGround:可视化神经网络

    https://cloud.tencent.com/developer/news/190352 http://playground.tensorflow.org PlayGround是一个在线演示.实 ...

  6. Swift开发第三篇——Playground

    本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...

  7. 使用Playground编写第一个Swift程序

    从控制台输出“HelloWorld”是我学习C语言的第一步,也是我人生中非常重要的一步.多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇.瑰丽的世界——Swift编程. ...

  8. 学习笔记TF047:PlayGround、TensorBoard

    PlayGround.http://playground.tensorflow.org .教学目的简单神经网络在线演示.实验图形化平台.可视化神经网络训练过程.在浏览器训练神经网络.界面,数据(DAT ...

  9. 《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift

    Swift 2.0学习笔记(Day4)——用Playground工具编写Swift 原创文章,欢迎转载.转载请注明:关东升的博客 用Playground编写Swift代码目的是为了学习.测试算法.验证 ...

随机推荐

  1. 学习Mahout (四)

    在Mahout 学习(三)中,我贴了example的代码,里面生成向量文件的代码: InputDriver.runJob(input, directoryContainingConvertedInpu ...

  2. [Noip2012普及组]摆花

    Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定 ...

  3. 干货:排名前16的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  4. dom4j的下载 在线文档 创建用户库

  5. XML标准和RFC官方文档

  6. Image.resize()和Image.thumbnail()的区别

    Image.resize()和Image.thumbnail()的区别 根据代码和代码注释, 这两个函数都是对图片进行缩放, 两者的主要区别如下: resize()函数会返回一个Image对象, th ...

  7. swift SqliteDB使用

    操作步骤: 1,在 Build Phases -> Link Binary With Libraries 中点击加号,添加 libsqlite3.0.tbd 到项目中来   2,创建连接头文件B ...

  8. hdu6311( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6311 从dls思路中,我整理一下自己的思路: 1.首先也是建图 2.建图结束后,一个df ...

  9. Unix高级编程之文件权限

    1.访问权限表 st_mode 意义 S_IRUSR 用户-读 S_IWUSR 用户-写 S_IXUSR 用户-执行 S_IRGRP 组-读 S_IWGRP 组-写 S_IXGRP 组-执行 S_IR ...

  10. CF1023D Array Restoration

    思路: 使用set即可,细节很多,容易出错. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3 ...