クラスを別のソースファイルにする

クラスを別のソースファイルにする

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

import UIKit

open class MyView: UIView{

    var imgView: UIImageView

    public init(img: UIImage?, frame: CGRect, color: UIColor) {    // <=(1)

        imgView = UIImageView(image: img)

        super.init(frame: frame)
        backgroundColor = color

        let x = arc4random_uniform(UInt32(frame.width))
        let y = arc4random_uniform(UInt32(frame.height))
        imgView = UIImageView(image: img)
        imgView.center = CGPoint(x: Int(x), y: Int(y))
        self.addSubview(imgView)

    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override open func draw(_ rect: CGRect) {    // <=(2)
        // 円を描く
        UIColor.blue.setStroke()
        let circle = UIBezierPath(ovalIn: CGRect(x: 10, y: 10, width: Int(self.frame.width) - 20 , height: Int(self.frame.height) - 20))

        circle.lineWidth = 4
        circle.stroke()
    }
}

(1)のイニシャライザでは引数として渡されたUIImageオブジェクトからUIImageViewを生成し、ランダムな位置に配置しています。アクセス修飾子に「public」を指定している点に注意してください。(2)ではUIViewのdraw(_:)メソッドをオーバーライドして円を描いています。

MyPlayground2と同様に、イメージファイル「cat1.png」をResourceフォルダに保存しておきます。

Playgroundファイルにコードを記述する

MyView.swiftを読み込むPlaygroundファイルのリストを示します。

リスト4:MyPlayground3.playground

//: Playground - noun: a place where people can play

import UIKit
import PlaygroundSupport

// イメージを生成
var myImg = UIImage(named: "cat1")

// MyViewクラスからコンテントビューを生成
let contentView = MyView(img: myImg, frame: CGRect(x:0, y:0, width:400, height:500), color: UIColor.yellow)

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(追加部分)

    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let pos = touch.location(in: self)

            imgView.center = pos
        }
    }
この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30