書いて覚えるSwift入門

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

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

import What?

今回はモジュール(module)について話します図1⁠。モジュールとはいったいなんでしょう?

図1 モジュールとは?

図1 モジュールとは?

macOSにもiOSにも標準搭載されているOxford American Dictionaryにはこうあります。

> _Computing_ any of a number of distinct but interrelated units from which a program may be built up or into which a complex activity may be analyzed.

同じく標準搭載のスーパー大辞林ではこうです。

> ④ ソフトウェアやハードウェアを構成する部分のうち,独立性が高く,追加や交換が容易にできるように設計された部品。

このとおり専門用語を超え一般用語として受け入れられているモジュールですが,コンピュータ言語における扱いは,てんでんばらばらちんぷんかんぷんまとまんない。そもそもCのように言語自体にはモジュールというコンセプトそのものが存在せず,モジュール相当の機能はリンカー(linker)で実現しているものもあれば,それすら永らく存在しなかったJavaScript注1もあれば,Perl 5 やPythonやRubyのようにはじめから基本機能として組み込まれているものまでさまざまです。Swiftは どうでしょうか?

結論に飛び付く前に実際に試してみましょう。Swift Playgroundでページを新規作成すると,次のようなテキストがはじめから入っています。

//: [Previous](@previous)

import Foundation

var str = "Hello, playground"

//: [Next](@next)

こういう,はじめから入っているものをboilerplateと呼びますが図2⁠,それはさておき,なぜimport Foundationという文言が入っているのでしょう?

図2 boilerplate

図2 boilerplate

では,var str = "Hello, playground"print(sqrt(2.0))と書き換えてみましょう。1.4142135623730951と表示されたはずです。ここでimport Foundationをコメントアウトしてみましょう図3⁠。今度はどうなりましたか?

図3 import Foundationをコメントアウト

図3 import Foundationをコメントアウト

今度は「sqrtなんて知らないよ」と言われます。さらに,sqrt(2.0)をただの2.0に変えてみましょう。どうなりましたか?

このことから次のことがわかります。

  • import Foundationなしでもprint()できる注2
  • import Foundationしないとsqrt()できない

つまり,sqrt()という関数(function)はSwift本体ではなく,Foundationというモジュールに存在し,importすることで使えるようになるというわけです。

これは,Cの#includeとは明らかに異なります。先ほどのSwift Playgroundの例をCで書くと,

#include <stdio.h>
#include <math.h>

int main(){
    printf("%.17g\n", sqrt(2.0));
    return 0;
}

となりますが,ここで#includeが入った行をすべて削除しても……。

図4のように警告は出てもコンパイルは通ってしまいます。Cの#includeは単に指定されたテキストファイルを挿入しているだけですが,Swiftのimportはもっと本質的に「そのモジュールを利用するにあたって必要なことをすべて行う」という意味になっています。

図4 コンパイルを実行

% cc -Wall sqrt2.c
sqrt2.c:7:5: warning: implicitly declaring library function 'printf' with type
      'int (const char *, ...)' [-Wimplicit-function-declaration]
    printf("%.17g\n", sqrt(2.0));
    ^
sqrt2.c:7:5: note: include the header <stdio.h> or explicitly provide a
      declaration for 'printf'
sqrt2.c:7:23: warning: implicitly declaring library function 'sqrt' with type
      'double (double)' [-Wimplicit-function-declaration]
    printf("%.17g\n", sqrt(2.0));
                      ^
sqrt2.c:7:23: note: include the header <math.h> or explicitly provide a
      declaration for 'sqrt'
2 warnings generated.

それでは「必要なこと」とはいったい何でしょう? こちらも書いて覚えましょう。

注1)
importはECMAScript2015(ES6)でやっと実現。
注2)
厳密にはimport Swiftされているともみなせる。

著者プロフィール

小飼弾(こがいだん)

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

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

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