ObjecTips

Swift & Objective-C で iOS とか macOS とか

Framework名とクラスヘッダファイル名のイレギュラー

XCTest.framework において XCTest クラスを定義しているヘッダファイルはちょっとイレギュラーな形になっている。
通常 XXAbc というクラス名であれば XXAbc.h というヘッダファイルで定義されるが XCTest の場合は XCAbstractTest.h というヘッダファイルにて

@interface XCTest : NSObject

と定義されている。
その上で framework 内には別途 XCTest.h ファイルも存在している。
XCTest.h には何が書かれているかというと、XCText.h は XCTest.framework で使用するパブリックなクラスファイル群を import するためのヘッダファイルになっている。

要は framework 名がまず先にあって、その framework 内で使用したいクラス名が framework 自体の名前と被ってしまっているため XCTest クラスの方の定義ファイルの名称を変更した形になっている。

framework を自作する際の例として考えると、
XXTwitter.framework を作るとしてそこで XXTwitter クラスを定義して使いたい場合、XXFooTwitter.h のような別名のファイルで

@interface XXTwitter : NSObject

とクラス定義して、XXTwitter.h で

#import <XXTwitter/XXFooTwitter.h>

で import する形になる。


Apple 純正の framework の場合 framework 名には prefix が付いていない事が多く、クラス名のみに prefix をつけておいてクラス群を import するヘッダファイルは <FrameworkName>.h の形にしておけばファイル名の衝突が起こらない。

例えば AssetsLibrary.framework の場合、使用されるクラスは ALAssetsLibrary ALAsset ALAssetsGroup と prefix がついていて、それらを読み込むヘッダファイルは AssetsLibrary.h となっている。

f:id:Koze:20150606135819p:plain

一部の例外はあるが、これが純正 framework では一番多い形になっている。