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で学ぶ文字コード
新生