import AppKitで'No such module'エラーが出た時の対処法
- 執筆
- 小幡十矛
- 公開日
結論:No such module 'AppKit'が表示されたら、最初にビルド対象のプラットフォームを確認します。AppKitはmacOSアプリのユーザーインターフェースを作るFrameworkです。iOS向けTargetではSwiftUIまたはUIKitを使い、macOS向けTargetではそのファイルのTarget Membershipと実行Schemeを確認します。
要点:import文を直す前に、どのTargetがそのファイルをコンパイルしているかを見ます。macOS専用コードはmacOS Targetへ分け、複数プラットフォームで共有するコードは#if canImport(AppKit)でコンパイル条件を明示します。ビルド対象から原因を切り分ける
| ビルド対象 | AppKitの扱い | 最初の対応 |
|---|---|---|
| macOSアプリ | macOS UIのFramework | macOS TargetとTarget Membershipを確認する |
| iOSアプリ | iOS UIには使わない | SwiftUIまたはUIKitへ置き換える |
| 複数プラットフォームのSwift Package | 利用できる環境だけでimportする | canImport(AppKit)で分岐する |
| 共有ファイル | Targetごとに利用可否が変わる | 共通ロジックとUIコードを分ける |
Apple公式は、AppKitをmacOSアプリのグラフィカルなユーザーインターフェースを構築・管理するFrameworkと説明しています。iOSアプリにはSwiftUIまたはUIKitを使う案内も同じページにあります。
macOS Targetで確認する3点
- Scheme:実行・ビルド対象がmacOSアプリのSchemeか確認する
- Target Membership:該当SwiftファイルがmacOS Targetへ含まれているか確認する
- コードの配置:AppKitを使うUIコードと、共通ロジックを別ファイルまたは別Targetへ分ける
AppleのXcode公式資料は、既存ファイルをTargetへ割り当てるとき、File inspectorのTarget Membershipで対象Targetを選ぶ方法を案内しています。ファイルが想定外のTargetにも含まれていると、別プラットフォーム向けビルドでimportが評価されます。
複数プラットフォームで共有する書き方
#if canImport(AppKit)
import AppKit
#elseif canImport(UIKit)
import UIKit
#endifSwift公式リファレンスでは、canImport()は指定したモジュールをimportできるかをコンパイル時に判定します。この条件はモジュールの存在を確認しますが、それ自体がimportを行うわけではありません。各分岐の中で必要なimportを明示します。
診断の順番
| 確認 | 分かったこと | 次の一手 |
|---|---|---|
| 現在のScheme | どの製品をビルドしているか | 意図したTargetへ切り替える |
| Target Membership | どのTargetがファイルをコンパイルするか | macOS専用ファイルを分離する |
| importの目的 | UI依存か共通ロジックか | SwiftUI・UIKit・AppKitを役割で選ぶ |
| 対応プラットフォーム | 条件分岐が必要か | canImport()で境界を明示する |
約10年のiOS開発で意識している境界
僕はiOSを含むITサービス・チーム開発を約10年経験し、サイバーエージェントではABEMA LiveのiOSアプリ開発とテックリードを担当しました。複数Targetを扱うときは、UI Frameworkの違いをimport文だけで吸収せず、共通ロジックとプラットフォーム固有UIの境界を先に決めています。構造が明確になるほど、次のエラーも追いやすくなります。
次に読む記事
よくある質問
AppKitはどのプラットフォームで使いますか?
AppKitはmacOSアプリのユーザーインターフェースを構築・管理するFrameworkです。iOSアプリではSwiftUIまたはUIKitを使います。
iOS Targetでimport AppKitを使えますか?
iOS向けUIにはAppKitではなくSwiftUIまたはUIKitを使います。共通ファイルにmacOS専用コードがある場合は、ファイル分割または条件付きコンパイルで境界を作ります。
macOSアプリなのにNo such moduleが出るときは何を見ますか?
現在のScheme、該当ファイルのTarget Membership、どのTargetがそのファイルをコンパイルしているかを順に確認します。
canImport(AppKit)は何を判定しますか?
指定したモジュールをimportできるかをコンパイル時に判定します。条件が真になる分岐の中で、必要なimportを明示します。
TargetとUI Frameworkの境界を、一緒に整理する
Scheme、Target Membership、共有コードの構成を持ち寄ると、どこから分けるかを1:1で整理できます。次のビルドで確かめる一手を決めましょう。