書いて覚えるSwift入門

第44回 Swiftのモジュールとは?

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

making your own module

ここでは実例としてswift-complexを利用してみます。Terminalからgit cloneしてcdしてswift buildしてみましょう図5)⁠

図5 git→git clone→cd→swift buildの流れ

% git clone https://github.com/dankogai/swift-complex.git
Cloning into 'swift-complex'...
remote: Enumerating objects: 1070, done.
remote: Total 1070 (delta 0), reused 0 (delta 0), pack-reused 1070
Receiving objects: 100% (1070/1070), 1.49 MiB ¦ 1.60 MiB/s, done.
Resolving deltas: 100% (519/519), done.
dankogai@dan-imac151[1032]:̃/work% cd swi
swift-complex/ swift/
% cd swift-complex
% swift build
Fetching https://github.com/dankogai/swift-floatingpointmath.git
Completed resolution in 1.02s
Cloning https://github.com/dankogai/swift-floatingpointmath.git
Resolving https://github.com/dankogai/swift-floatingpointmath.git at 0.1.0
Compile Swift Module 'FloatingPointMath' (1 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/libFloatingPointMath.dylib
Compile Swift Module 'Complex' (2 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/libComplex.dylib
Compile Swift Module 'ComplexRun' (1 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/ComplexRun

ここまではうまくいきました。ところがREPLを開いてimport Complexしてみようとすると……図6)⁠

図6 REPLで実行

% swift
Welcome to Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1). Type :help for assistance.
  1> import Complex
error: repl.swift:1:8: error: no such module 'Complex'
import Complex
       ^
  1>

そんなモジュールはないと怒られてしまいます。何が足りないのでしょう? あるはずのComplexモジュールはどこにあるのでしょう?

どうやら.build/debugというディレクトリにあるようですが図7)⁠Swiftはそこにあることを知らないようです。そこにあるということをSwiftに教えてあげるにはどうしたらよいでしょう? 図8が答えになります。

図7 Complexモジュールはどこにある?

% ls .build/debug/
Complex.build                  ComplexRun.swiftmodule
Complex.product                FloatingPointMath.build
Complex.swiftdoc               FloatingPointMath.product
Complex.swiftmodule            FloatingPointMath.swiftdoc
ComplexPackageTests.product    FloatingPointMath.swiftmodule
ComplexRun                     ModuleCache
ComplexRun.build               libComplex.dylib
ComplexRun.dSYM                libComplex.dylib.dSYM
ComplexRun.product             libFloatingPointMath.dylib
ComplexRun.swiftdoc            libFloatingPointMath.dylib.dSYM

図8 Swiftコマンドに設定を追加

% swift -I.build/debug -L.build/debug -lComplex
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> Complex.sqrt(-1.0)
$R0: Complex.Complex<Double> = {
  real = 0
  imag = 1
}
  3>

Xcodeのプロジェクトであればどこに何があるのかは自動で管理されていますが,裏ではこういうことが行われているわけです。しかしXcodeはmacOSにしかありませんし,これは何とも面倒です。面倒なので,筆者がGitHubで公開しているモジュールはscripts/runrepl.shというシェルスクリプトを同封していますが,これくらい標準でできるようになってほしい……と思ったら,swift run --replでできるようになるようです。

ただし実装されているのは,執筆現在はSnapshot版だけで,リリース版最新のSwift 4.2.1では次のとおり断られます。

% swift run --repl
error: unknown option --repl; use --help to list
available options

importできるならexportはできないの?

ところで,importの有効範囲は,それが宣言された場所からソースファイルの終わりまでです。たとえばモジュールAでimport Bしていたとして,import Aしたソース中ではimport Bしたことにはなりません。import Aしたら同時にimport Bするにはどうしたらよいでしょう? 任意精度(有理数|浮動小数点数)をSwiftで実装したswift-bignumというモジュールもメンテしているのですが,そこでは内部的に任意精度整数モジュールBigIntを使っています。任意精度有理数や浮動小数点数が使える状態で整数が使えないという状況は変なのでimport BigNumしたらimport BigIntも同時に行いたかったのですが,これは次のとおり解決しました。

@_exported import BigInt

アンダースコアが付いていることからも察せられるように,これは現時点ではundocumented featureなのですが,正式にサポートされることを願っています。

iPad Proを(まだ)買わなかった理由

10月30日のSpecial EventでAppleは溜まった宿題をまとめて片付けた感があります。iMac Proに匹敵する性能までカバーしたMac miniにUSB-C化されたMacBook Air,そして脱LightningしたiPad Pro写真1)⁠目玉はなんといってもiPad Proのはずですが,その1週間後に筆者が衝動買いしてしまったのは……MacBook Airでした写真2)⁠

写真1 iPad Pro

写真1 iPad Pro

写真2 MacBook Air

写真2 MacBook Air

理由はただ1つ。iOSにはXcodeがまだないから。Swift自体はSwift Playgroundで使えます。が,いまだにmacOSやLinuxで使えるモジュールが使えない。前述のswift-complexではiOS用のPlaygroundを生成するのに必要なソースをamalgamateするという苦肉の策をとっています。RAM容量を除けばiPad Proのほうがずっと高性能なのに……。

Xcode for iPadを待ちかねつつ,次回はモジュールを軸としたSwiftの開発の実際をお届けする予定です。

Software Design

本誌最新号をチェック!
Software Design 2019年7月号

2019年6月18日発売
B5判/192ページ
定価(本体1,220円+税)

  • 第1特集
    ⁠速い⁠Webアプリケーションの作り方[バックエンド編]
    ボトルネックの見つけ方,キャッシュ・CDNの活用
  • 第2特集
    IT業界ビギナーのためのDocker+k8s入門講座[Kubernetes編]
    図解で深く理解して最先端にキャッチアップ!
  • 特別企画
    完全マネージ型のメリットを堪能する
    Amazon SageMaker入門
  • 特別企画
    クラウドへのルータ接続実践ノウハウ
    【2】AWSとヤマハルータをつなぐ
  • 一般記事
    「WebAuthn」が導く新時代のパスワードレス認証
    【後編】WebAuthnを利用したFIDO導入のための考え方
  • 短期連載
    Mattermost[導入+構築]入門
    【最終回】ご存じですか? chat導入のメリット

著者プロフィール

小飼弾(こがいだん)

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

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

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