書いて覚えるSwift入門

第38回 Swift Package Manager

この記事を読むのに必要な時間:およそ 4 分

Swiftにcpan相当のツールはあるのか?

モダンプログラミング言語は,単にプログラムを

  • 書いて
  • 実行する

だけではなく,

  • 機能をライブラリ(library)にまとめ,
  • モジュール(module)として公開し
  • それを援用する

機能まで備えているものです。Perlのcpanを嚆矢こうしに,Pythonならpip,Rubyならgem,ECMAScriptならnpm……ではSwiftは?

あります! Swift 3以降は。その名もSwiftPackage Manager。それ以前から同様の機能を提供するサードパーティー製のツールとしてはCarthageCocoaPodsが存在していましたが,Swift Package Managerはその名のとおりSwiftに標準装備され,すべての作業がSwiftで完結するという点で画期的です。まだまだ「老舗」ツールに比べると機能面で見劣りはしますが,標準装備というのはそれを上回る利点ですし,MacだけでなくLinuxでも同じように使えることで,とくにServer Side Swiftではこれが標準となっていくものと断言できるところまで来ました。

ライブラリを作る

ではさっそく,書いて覚えていきましょう。ここではFizzBuzzモジュールを作ってみます。Terminal.appから次のコマンドを実行します。

$ mkdir FizzBuzz
$ cd FizzBuzz
$ swift package init # --type=library
 ……(中略)……
Creating library package: FizzBuzz
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/FizzBuzz/FizzBuzz.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/FizzBuzzTests/
Creating Tests/FizzBuzzTests/FizzBuzzTests.swift
Creating Tests/FizzBuzzTests/XCTestManifests.swift

実はこの時点でビルドしてテストできる状態になっています。

$ swift build

で,

Compile Swift Module 'FizzBuzz' (1 sources)
 ……(中略)……
$ swift test

となり,図1のようになります。

図1 ライブラリの作成

Compile Swift Module 'FizzBuzzTests' (2 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/FizzBuzzPackageTests.xctest/Contents/MacOS/
FizzBuzzPackageTests
Test Suite 'All tests' started at 2018-05-21 07:23:10.304
Test Suite 'FizzBuzzPackageTests.xctest' started at 2018-05-21 07:23:10.305
Test Suite 'FizzBuzzTests' started at 2018-05-21 07:23:10.305
Test Case '-[FizzBuzzTests.FizzBuzzTests testExample]' started.
Test Case '-[FizzBuzzTests.FizzBuzzTests testExample]' passed (0.085 seconds).
Test Suite 'FizzBuzzTests' passed at 2018-05-21 07:23:10.390.
   Executed 1 test, with 0 failures (0 unexpected) in 0.085 (0.085) seconds
Test Suite 'FizzBuzzPackageTests.xctest' passed at 2018-05-21 07:23:10.390.
   Executed 1 test, with 0 failures (0 unexpected) in 0.085 (0.085) seconds
Test Suite 'All tests' passed at 2018-05-21 07:23:10.390.
   Executed 1 test, with 0 failures (0 unexpected) in 0.085 (0.085) seconds

しかしこの状態ではとくに何もしていません。実際にFizzBuzzしてみましょう。

$ swift package generate-xcodeproj

とすると Xcode Project が生成されるので,

$ open FizzBuzz.xcodeproj

で開きます図2)⁠

図2 FizzBuzz.xcodeprojの実行

図2 FizzBuzz.xcodeprojの実行

まずはモジュールを書き直しましょう。リスト1のとおり上書きします。Intfizzbuzzプロパティを追加するだけの簡単なモジュールです。

リスト1 Sources/FizzBuzz/FizzBuzz.swift

extension Int {
    public var fizzbuzz:String {
        let fb = ("Fizz", "Buzz")
        switch (self % 3, self % 5) {
        case (0, 0) : return fb.0 + fb.1
        case (0, _) : return fb.0
        case (_, 0) : return fb.1
        default : return "\(self)"
        }
    }
}

テストも書き直しましょうリスト2)⁠

リスト2 Tests/FizzBuzzTests/FizzBuzzTests.swift

final class FizzBuzzTests: XCTestCase {
    func test0() { XCTAssertEqual(0.fizzbuzz, "FizzBuzz") }
    func test1() { XCTAssertEqual(1.fizzbuzz, "1") }
    func test2() { XCTAssertEqual(2.fizzbuzz, "2") }
    func test3() { XCTAssertEqual(3.fizzbuzz, "Fizz") }
    func test4() { XCTAssertEqual(4.fizzbuzz, "4") }
    func test5() { XCTAssertEqual(5.fizzbuzz, "Buzz") }
}

今度は,Xcodeからテストしなおしてみましょう。⁠Command]⁠-⁠U]を押して,図3のとおりに全テスト項目が緑になれば成功です。

図3 Testの実行結果

図3 Testの実行結果

とりあえず最低限文化的なFizzBuzzモジュールができたので,Terminalに戻ってgitリポジトリを作成します。

% git init
% git add .
% git commit -am 'version 0.0.0'
% git tag 0.0.0

これで,公開可能なモジュールが1つできあがりました。

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。

コメント

コメントの記入