모듈이란 하나의 프레임워크, 라이브러리, 패키지 단위를 의미해요. Swift 에서 import XXX 할때 XXX 가 모듈명이에요. 라이브러리는 '모듈' 단위로 프로젝트에 통합되는 구조예요.
Swift Package 는 Git repository 에 있는 Package.swift 파일로 정의된 라이브러리예요.
import XXX
만으로 사용할 수 있어요?Xcode 가 package 를 build target 에 통합하면 모듈 맵을 생성해요. 컴파일러는 이 맵을 토대로 모듈을 인식해서 import 하는 거죠.
모듈맵은 Swift 컴파일러에게 이 라이브러리는 이렇게 생겼고, 이렇게 import 할 수 있어라고 알려주는 파일인데요. 모듈맵에서 모듈 이름을 정의하여 import XXX
로 사용할 수 있어요.
swift 로 작성된 라이브러리는 모듈 시스템이 내장 되어있어 있어서 별도의 모듈맵 파일을 작성할 필요가 없어요.
C 나 Objective-C 라이브러리의 경우 모듈맵을 가지고 있지 않아요.
module.modulemap 파일은 아래처럼 생성해요.
module Alamofire {
header "Alamofire.h"
export *
}
이렇게 module.modulemap 파일을 작성하면 모듈 단위로 import 가 가능해요.
직접 파일을 만들어서 예를 들어 볼게요.
C 언어로 작성된 MathLib 를 생성하고, add 메소드를 가지고 올거예요.
int add(int a, int b);
#include "mathlib.h"
int add(int a, int b) {
return a + b;
}
#ifndef mathlib_h
#define mathlib_h
int add(int a, int b);
#endif /* mathlib_h */
module MathLib {
header "include/mathlib.h"
export *
}
내가 만든 C 프로젝트를 MathLib 라는 이름으로 내보내겠다는 뜻이예요.
import PackageDescription
let package = Package(
name: "ProejctName",
products: [
.library(
name: "MathLib",
targets: ["MathLib"]),
],
targets: [
.target(
name: "MathLib",
dependencies: [],
path: "Sources",
sources: ["mathlib.c"],
publicHeadersPath: "include"
),
.testTarget(
name: "MathLibTests",
dependencies: ["MathLib"]),
]
)
Swift 프로젝트로 돌아와서 Package Dependency 만 추가해 주면, import MathLib
으로 사용할 수 있어요.
import MathLib
MathLib.add(10, 10)
정리하자면, module 은 import 가능한 코드 단위를 말해요. import 해서 사용하기 위해서는 module map 이 필요한 데요. module map 은 컴파일러에게 모듈의 정보를 알려주는 파일이에요. Swift 에서는 자동으로 생성해 주지만 C, Objective-C에서는 직접 생성해 주어야 해요.