swift package init
モジュールと言えばswift package manager
パッケージをサポートしたたいていの言語では,swift package init
。MyModule
というパッケージを作成するとしたら,
$ mkdir MyModule $ cd MyModule $ swift package init
とコマンドを3つ打つと,MyModule
ディレクトリ以下に,
Creating library package: MyModule Creating Package.swift Creating README.md Creating .gitignore Creating Sources/ Creating Sources/MyModule/MyModule.swift Creating Tests/ Creating Tests/LinuxMain.swift Creating Tests/MyModuleTests/ Creating Tests/MyModuleTests/MyModuleTests.swift Creating Tests/MyModuleTests/XCTestManifests.swift
と最低限必要なファイルが生成されるわけですが,swift package init MyModule
とディレクトリ名が指定されている場合は1コマンドで済むようにして,
それはさておき,
図1 モジュールのテストを実施
$ swift test % swift test Compile Swift Module 'MyModule' (1 sources) Compile Swift Module 'MyModuleTests' (2 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/MyModulePackageTests.xctest/Contents/MacOS/MyModulePackageTests Test Suite 'All tests' started at 2018-12-17 11:01:49.690 Test Suite 'MyModulePackageTests.xctest' started at 2018-12-17 11:01:49.690 Test Suite 'MyModuleTests' started at 2018-12-17 11:01:49.690 Test Case '-[MyModuleTests.MyModuleTests testExample]' started. Test Case '-[MyModuleTests.MyModuleTests testExample]' passed (0.231 seconds). Test Suite 'MyModuleTests' passed at 2018-12-17 11:01:49.921. Executed 1 test, with 0 failures (0 unexpected) in 0.231 (0.231) seconds Test Suite 'MyModulePackageTests.xctest' passed at 2018-12-17 11:01:49.921. Executed 1 test, with 0 failures (0 unexpected) in 0.231 (0.231) seconds Test Suite 'All tests' passed at 2018-12-17 11:01:49.921. Executed 1 test, with 0 failures (0 unexpected) in 0.231 (0.231) seconds
あとはここから.swift
なファイルを編集したり,Sources/
ディレクトリ以下にSwiftソースファイルを追加したり,Tests/
以下にテストコードを追加したりしていくわけですが,.gitignore
の差し替え。SPMが生成してくれるものは,
.DS_Store
/.build
/Packages
/*.xcodeproj
しかないのですが,Swift.
と差し替えるのがよいでしょう。あるいははじめからGitHubでの公開を前提にするのであれば,git clone
したあと,cd MyModule && swift package init
としてもよいでしょう。
そこまで終わったらトップディレクトリからgit add .
してgit commit -a
しておきましょう。
モジュールはなるべくモジュラーに
次に行うべきは, が追加されています。これは また名前空間をプロトコルとして提供することで, 余談かつ私見ですが,Package.
の編集。ほかのパッケージを使わない場合はそのままでもたいていOKですが,dependencies: []
の中に.package
を追加しておきます。拙Gitリポジトリでは,
.package(
url: "https://
exp
やsin
といった,Foundation
で追加される数学関数をFloatingPointMath
というプロトコルに準拠する型T
の型関数,T.
やT.
として明示的に指定して使えるようにする,Double.
がComplex.
と別物として利用できてコードの見通しが向上します。
% scripts/run-repl.sh
Welcome to Apple Swift version 4.2.1
(swiftlang-1000.11.42 clang-1000.11.45.1). Type
:help for assistance.
1> import Complex
2> Double.sqrt(-1)
$R0: Double = NaN
3> Complex.sqrt(-1)
$R1: Complex.Complex<Double> = {
real = 0
imag = 1
}
Foundation
はあまりに多くの関数をトップレベルにimport
してくれるおかげで小さなプログラムを手軽に書ける反面,log
は対数なのかログなのか……JavaScriptでもMath.
とconsole.
と一目瞭然なのに。もっともFoundation
はObjective-Cのレガシィを背負ったモジュールである以上,Foundation
相当は別途用意すべきなのかもしれませんが。