MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

Swiftで複数のソースファイルを使用する際の注意事項 [swift1.2] [XCTest]

お盆ボケが抜けきらない今日この頃です。
3日間ほどハマってしまい、本来やりたいGame Centerの勉強できませんでした。
今日はそのハマり部分について記録しておこうと思います。

ハマった部分はズバリ 複数のソースファイルを使用したプロジェクトでのコンパイルエラー です。

自分ポイント1

通常Swiftでは複数のソースファイルを使用した場合でも、(自分で敢えて記載しない限り)特に気にすることなく他のソースファイルからクラスや構造体などを呼び出すことができます。(気にしなさすぎて逆にきになしちゃうくらい気にしなくていいです。)

例えば、他ファイルで宣言しているクラスを、ViewControllerで使いたい場合。
通常通りのなーんにも考えずにインスタンス化すればOK。 もちろん Project → Build Phases にて新規追加したファイルをコンパイル対象としてくことが必要です。(まぁ、XcodeのFile→Newなどで新規追加した場合は、自動的にコンパイル対象となっていますが。) サンプル以下です。

//
//  TestClass.swift
//

import Foundation

class TestClass {
    let testStr = "testestest"
    func printTest() {
        println("\(testStr)")
    }
}
//
//  ViewController.swift
//

import UIKit

class ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let test: TestClass = TestClass()
        test.printTest()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

自分ポイント2

自分ポイント1にて、無事に他のソースファイルに記載されたクラスをViewControllerにて使用出来たと思います。
しかし、「XCTestの使用を想定しているプロジェクト」の場合、ここで何もしていないと私と同じ部分でハマってしまいますので注意が必要です。

例えば、ViewControllerに記載している関数の自動単体テストを予め実装している場合、 ViewController.swift にて、テスト用ファイル(以下の場合TestTests.swift)をターゲットとして追加しているはずです。(Utilities AreaのTarget Membershipを参照。)
f:id:anthrgrnwrld:20150819215256p:plain

このままだと Use of undeclared type '...' と怒られてビルドすることが出来ません。
f:id:anthrgrnwrld:20150819220114p:plain

この解決方法としては、新規追加したファイルについても、"テスト用ファイル"をTargetとする、つまり (Target Membershipにて)チェックを追加する ことです。こうすると怒られることなくビルドが通ります。

なぜ上記で解決するのか、という理由については、正確な説明が出来ないので省略しますが、ViewControllerをテスト対象としている限りは、その中で読んでいるファイルに関してもターゲット追加しとかないといけないのかな〜といった認識をしています。

ん〜、なんか上手く説明出来ませんでしたね。完全に自分用の備忘録になってしまった気が...。