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コマンドで済むようにして、
それはさておき、
$ 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しておきましょう。
モジュールはなるべくモジュラーに
次に行うべきは、 が追加されています。これは また名前空間をプロトコルとして提供することで、 余談かつ私見ですが、 SPMの各コマンドは、 Travis CIではもっとかかるので、 SPMはCPANやRuby Gemsといったほかの言語のパッケージマネージャーにおける開発に慣れた人には非常にとっつきやすいツールですが、 swift-complex程度の小さなモジュールであればまだいいのですが、 iOSにネイティブ開発環境がない辛さ。今まで その位置ゲーも、 「街区が広過ぎて、 話を戻して、 2022年8月18日発売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相当は別途用意すべきなのかもしれませんが。リリース版をビルド
-creleaseを付けます。さらに-Xswiftc -enabletestingを付けると、BigRatと任意精度浮動小数点数型BigFloatを提供するモジュールですが、% swift test
(……省略……)
Test Suite 'RationalTests' passed at 2018-12-17 12:17:46.703.
Executed 10 tests, with 0 failures (0 unexpected) in 0.055 (0.055) seconds
Test Suite 'BigNumPackageTests.xctest' passed at 2018-12-17 12:17:46.703.
Executed 22 tests, with 0 failures (0 unexpected) in 231.611 (231.612) seconds
Test Suite 'All tests' passed at 2018-12-17 12:17:46.703.
Executed 22 tests, with 0 failures (0 unexpected) in 231.611 (231.612) seconds
-c release-Xswiftc -enable-testingを指定するようにしたところ10秒で完了するようになりました% swift test -c release -Xswiftc -enable-testing
(……省略……)
Test Suite 'RationalTests' passed at 2018-12-17 12:11:59.578.
Executed 10 tests, with 0 failures (0 unexpected) in 0.009 (0.009) seconds
Test Suite 'BigNumPackageTests.xctest' passed at 2018-12-17 12:11:59.578.
Executed 22 tests, with 0 failures (0 unexpected) in 10.176 (10.178) seconds
Test Suite 'All tests' passed at 2018-12-17 12:11:59.578.
Executed 22 tests, with 0 failures (0 unexpected) in 10.176 (10.178) seconds
未サポートのiOSでもSPMしたい
scripts/というPerlスクリプトでそれを実現しています#!/usr/bin/env perl
use strict;
use warnings;
use feature ':all';
use FileHandle;
use Fatal;
my $dep = 'FloatingPointMath';
my $target = 'monoComplex.swift';
sub find {
my $name = shift;
use File::Find ();
my @dirs = ('.build/checkouts');
my @paths;
File::Find::find(
{
wanted => sub {
$_ eq $name and push @paths, $File::Find::name;
}
},
@dirs
);
die "$name not found" if !@paths;
return @paths;
}
system qw/swift build/;
my $wfh = FileHandle->new($target, 'w');
for my $fn ( <Sources/Complex/*.swift>, find( $dep . '.swift' ) ) {
my $rfh = FileHandle->new($fn, 'r');
for (<$rfh>) {
next if /\Aimport $dep/;
$wfh->print($_);
}
}モバイルコンピューティングにモバイルプログラミングを
次回予告
DoubleやFloatを直接extendするのではなく、Float ingPointMathというプロトコルを用意したうえでそれらの型を準拠させるようにしています。なぜそうしたのか?本誌最新号をチェック!
Software Design 2022年9月号
B5判/
定価1,342円
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識
OSSソースコードリーディングのススメ
企業のシステムを支えるOSとエコシステムの全貌
今さら聞けないSSH
MySQLで学ぶ文字コード
新生
