import What?
今回はモジュール
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.
同じく標準搭載のスーパー大辞林ではこうです。
> ④ ソフトウェアやハードウェアを構成する部分のうち,
独立性が高く, 追加や交換が容易にできるように設計された部品。
このとおり専門用語を超え一般用語として受け入れられているモジュールですが,
結論に飛び付く前に実際に試してみましょう。Swift Playgroundでページを新規作成すると,
//: [Previous](@previous)
import Foundation
var str = "Hello, playground"
//: [Next](@next)
こういう,import Foundation
という文言が入っているのでしょう?
では,var str = "Hello, playground"
をprint(sqrt(2.
と書き換えてみましょう。1.
と表示されたはずです。ここでimport Foundation
をコメントアウトしてみましょう
今度はsqrt(2.
をただの2.
に変えてみましょう。どうなりましたか?
このことから次のことがわかります。
import Foundation
なしでもprint()
できる(注2) import Foundation
しないとsqrt()
できない
つまり,sqrt()
という関数Foundation
というモジュールに存在し,import
することで使えるようになるというわけです。
これは,#include
とは明らかに異なります。先ほどのSwift Playgroundの例をCで書くと,
#include <stdio.h>
#include <math.h>
int main(){
printf("%.17g\n", sqrt(2.0));
return 0;
}
となりますが,#include
が入った行をすべて削除しても……。
図4のように警告は出てもコンパイルは通ってしまいます。Cの#include
は単に指定されたテキストファイルを挿入しているだけですが,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されているともみなせる。