在 Xcode 10.2 中有一个PlaygroundSupport
框架。它共享 Playground 数据、管理实时视图并控制 Playground 的执行。
import PlaygroundSupport
您可以在 Playground 内使用 Playground Support 来:
- 访问游乐场页面并管理其执行
- 访问和共享持久数据
- 评估学习者的进度、更新提示并显示成功文本
您还可以使用PlaygroundSupport
来显示和关闭实时视图,这些视图显示了在 Playground 中运行代码的结果。您可以利用许多现有类型上可用的内置实时视图表示来为您自己的类型创建实时视图。Xcode 和 Swift Playgrounds 的 Playground 中提供了传统的实时视图。它们与 Playground 中的代码在同一进程中运行,因此您可以像往常一样访问它们的属性和方法;但是,每次运行 Playground 时它们都会重置。Swift Playgrounds 中始终在线的实时视图在您将 LiveView.swift 添加到页面时激活,它在自己的进程中执行,因此您可以在连续运行之间保留信息和视觉效果。在您离开页面之前,永远在线的实时视图不会重置。
关于适用于 iPad 的Swift Playgrounds阅读此处。
编码:
import PlaygroundSupport
import UIKit
import SceneKit
import QuartzCore
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 1000, height: 200))
var scene = SCNScene()
sceneView.scene = scene
sceneView.backgroundColor = .black
PlaygroundPage.current.liveView = sceneView
var lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .directional
lightNode.light?.intensity = 3000
lightNode.light?.shadowMode = .deferred
lightNode.rotation = SCNVector4(x: 0, y: 0, z: 0.5, w: 1.5 * Float.pi)
scene.rootNode.addChildNode(lightNode)
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 2.5, y: 0, z: 5)
scene.rootNode.addChildNode(cameraNode)
var box = SCNBox(width: 3, height: 3, length: 3, chamferRadius: 0.4)
var boxNode = SCNNode(geometry: box)
scene.rootNode.addChildNode(boxNode)
box.firstMaterial?.diffuse.contents = UIColor.blue
box.firstMaterial?.specular.contents = UIColor.purple
boxNode.rotation = SCNVector4(x: 1.0, y: 1.0, z: 0.0, w: 0.0)
boxNode.scale = SCNVector3(x: 1.0, y: 1.0, z: 1.0)
var spin = CABasicAnimation(keyPath: "rotation.w")
var scale = CABasicAnimation(keyPath: "scale.x")
spin.toValue = 3 * -CGFloat.pi
spin.duration = 2
spin.repeatCount = .greatestFiniteMagnitude
scale.toValue = 1.5
scale.duration = 2
scale.repeatCount = .infinity
boxNode.addAnimation(spin, forKey: "spin around")
boxNode.addAnimation(scale, forKey: "scale x")