Xcode 10.2 にはPlaygroundSupport
フレームワークがあります。プレイグラウンド データを共有し、ライブ ビューを管理し、プレイグラウンドの実行を制御します。
import PlaygroundSupport
プレイグラウンド内からプレイグラウンド サポートを使用して、次のことを行うことができます。
- Playground ページにアクセスしてその実行を管理する
- 永続データへのアクセスと共有
- 学習者の進捗状況を評価し、ヒントを更新し、成功テキストを表示します
PlaygroundSupport
を使用して、プレイグラウンドでコードを実行した結果を示すライブ ビューを表示および非表示にすることもできます。多くの既存のタイプで使用できる組み込みのライブ ビュー表現を利用して、独自のタイプのライブ ビューを作成できます。従来のライブ ビューは、Xcode の Playground と Swift Playgrounds で利用できます。それらはプレイグラウンドのコードと同じプロセスで実行されるため、通常どおりプロパティとメソッドにアクセスできます。ただし、プレイグラウンドを実行するたびにリセットされます。ページに LiveView.swift を追加するとアクティブ化される Swift Playgrounds の常時ライブ ビューは、独自のプロセスで実行されるため、連続する実行間で情報とビジュアルを保持できます。常時表示のライブ ビューは、ページを離れるまでリセットされません。
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")
