Swiftにcpan相当のツールはあるのか?
モダンプログラミング言語は,
- 書いて
- 実行する
だけではなく,
- 機能をライブラリ
(library) にまとめ, - モジュール
(module) として公開し - それを援用する
機能まで備えているものです。Perlのcpanを嚆矢に,
あります! Swift 3以降は。その名もSwiftPackage Manager。それ以前から同様の機能を提供するサードパーティー製のツールとしてはCarthageやCocoaPodsが存在していましたが,
ライブラリを作る
ではさっそく,
$ 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 ライブラリの作成
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
で開きます
まずはモジュールを書き直しましょう。リスト1のとおり上書きします。Int
にfizzbuzz
プロパティを追加するだけの簡単なモジュールです。
リスト1 Sources/
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 Tests/
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") }
}
今度は,
とりあえず最低限文化的なFizzBuzzモジュールができたので,
% git init % git add . % git commit -am 'version 0.0.0' % git tag 0.0.0
これで,