結論: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のFrameworkmacOS 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点

  1. Scheme:実行・ビルド対象がmacOSアプリのSchemeか確認する
  2. Target Membership:該当SwiftファイルがmacOS Targetへ含まれているか確認する
  3. コードの配置:AppKitを使うUIコードと、共通ロジックを別ファイルまたは別Targetへ分ける

AppleのXcode公式資料は、既存ファイルをTargetへ割り当てるとき、File inspectorのTarget Membershipで対象Targetを選ぶ方法を案内しています。ファイルが想定外のTargetにも含まれていると、別プラットフォーム向けビルドでimportが評価されます。

複数プラットフォームで共有する書き方

#if canImport(AppKit)
import AppKit
#elseif canImport(UIKit)
import UIKit
#endif

Swift公式リファレンスでは、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で整理できます。次のビルドで確かめる一手を決めましょう。

AIを仕事の仕組みに変えたい20代へ

AIを使うだけでなく、1業務をチームの仕組みへ

社会人1〜3年目が身近な1業務を選び、人とAIの役割を分け、7日で試し、成果を共有する5ステップをまとめました。

若手社員のAI業務改善5ステップを見る
カフェ・オンライン30分の日時を見る