クラスを別のソースファイルにする
Playgroundでは、メインのPlaygroundファイルとは別に、SourcesフォルダにSwiftファイルを用意することで、それを読み込んで使用することもできます。この場合もコンパイルを手動で行う必要はありません。Playgroundファイルの拡張子は「.playground」ですが、Swiftファイルの拡張子は通常通り「.swift」となります。ここでは、以下の手順でカスタムビューとしてMyViewクラスを作成して、別ファイル「MyView.swift」に保存し、それをPlaygroundファイルから使用してみましょう。
1.「Project Navigator」の「Sources」を右クリックし、表示されるメニューから「New File」を選択します。
2.「Sources」フォルダに「New File.swift」という空のファイルが作成されるので、名前を変更します。
次の例では「MyView.swift」に変更しています。
クラスを別のソースファイルにする
MyViewクラスを作成する
MyViewクラスでは、イニシャライザの第一引数としてUIImageオブジェクトを受け取り、ビュー内のランダムな位置にUIImageViewとして配置しています。次に、MyView.swiftのリストを示します。
リスト3:MyView.swift
03 | open class MyView: UIView{ |
05 | var imgView: UIImageView |
07 | public init(img: UIImage?, frame: CGRect, color: UIColor) { // <=(1) |
09 | imgView = UIImageView(image: img) |
11 | super.init(frame: frame) |
12 | backgroundColor = color |
14 | let x = arc4random_uniform(UInt32(frame.width)) |
15 | let y = arc4random_uniform(UInt32(frame.height)) |
16 | imgView = UIImageView(image: img) |
17 | imgView.center = CGPoint(x: Int(x), y: Int(y)) |
18 | self.addSubview(imgView) |
22 | required public init?(coder aDecoder: NSCoder) { |
23 | fatalError("init(coder:) has not been implemented") |
26 | override open func draw(_ rect: CGRect) { // <=(2) |
28 | UIColor.blue.setStroke() |
29 | let circle = UIBezierPath(ovalIn: CGRect(x: 10, y: 10, width: Int(self.frame.width) - 20 , height: Int(self.frame.height) - 20)) |
(1)のイニシャライザでは引数として渡されたUIImageオブジェクトからUIImageViewを生成し、ランダムな位置に配置しています。アクセス修飾子に「public」を指定している点に注意してください。(2)ではUIViewのdraw(_:)メソッドをオーバーライドして円を描いています。
MyPlayground2と同様に、イメージファイル「cat1.png」をResourceフォルダに保存しておきます。
Playgroundファイルにコードを記述する
MyView.swiftを読み込むPlaygroundファイルのリストを示します。
リスト4:MyPlayground3.playground
01 | //: Playground - noun: a place where people can play |
04 | import PlaygroundSupport |
07 | var myImg = UIImage(named: "cat1") |
09 | // MyViewクラスからコンテントビューを生成 |
10 | let contentView = MyView(img: myImg, frame: CGRect(x:0, y:0, width:400, height:500), color: UIColor.yellow) |
12 | PlaygroundPage.current.liveView = contentView |
次に実行結果を示します。アシスタントエディタを2つ表示し、一つはSwiftファイルのエディタに、もう一つは実行結果の表示に使用すると作業がやりやすくなります
実行結果の確認
liveViewでタッチイベントを受け取る
PlaygroundSupportモジュールを使用すると、liveViewでタッチイベントなどのイベントを受け取ることもできます。次に、MyPlayground3を変更し、クリックした位置にイメージを移動する例を示します(MyPlayground4)。
クリックする前、猫は左上に
クリックした地点に猫が移動する
変更点はMyView.swiftのMyViewクラスに、touchesEnded(_:with:)メソッドをオーバーライドして追加し、タッチ位置にimyViewを移動している点です(Swift 2.0以降ではtouchesBeganメソッドの最初の引数が、NSObjectではなく、UITouchのSetオブジェクトとなりました)
リスト5:MyView.swift(追加部分)
1 | override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { |
2 | if let touch = touches.first { |
3 | let pos = touch.location(in: self) |