💬
Xcode Generate Asset Symbolsの「Image」接尾辞問題
概要
Xcode 15で導入されたGenerate Asset Symbols機能で、「Image」で終わるアセット名が正しく解決されない問題に遭遇しました。その原因と解決策をまとめます。
問題の発生
以下のようなコードで、一部のアセットでエラーが発生しました:
enum Icons {
public static let addPhotoLibrary = Image(.addPhotoLibrary) // ✅ 正常
public static let editImage = Image(.editImage) // ❌ エラー
public static let noImage = Image(.noImage) // ❌ エラー
public static let propertyImage = Image(.propertyImage) // ❌ エラー
}
エラー内容:Reference to member 'editImage' cannot be resolved without a contextual type
原因
Generate Asset Symbolsは、シンボル生成時に特定の接尾辞を自動削除します:
-
editImage
→.edit
-
noImage
→.no
-
propertyImage
→.property
GeneratedAssetSymbols.swift
を確認すると:
extension DeveloperToolsSupport.ImageResource {
/// The "noImage" asset catalog image resource.
static let no = ImageResource(name: "noImage", bundle: resourceBundle)
/// The "editImage" asset catalog image resource.
static let edit = ImageResource(name: "editImage", bundle: resourceBundle)
}
アセット名は"noImage"
、"editImage"
なのに、生成されるシンボル名は.no
、.edit
になっています。
GeneratedAssetSymbols.swiftの確認方法
- プロジェクトをビルド
- Xcodeの左側のナビゲーターで「Show the Report navigator」(⌘+9)を選択
- 最新のビルドログを展開
-
GeneratedAssetSymbols.swift
ファイルを探してクリック
または、Finderで以下のパスを確認:
~/Library/Developer/Xcode/DerivedData/[ProjectName]/Build/Intermediates.noindex/[Target]/DerivedSources/GeneratedAssetSymbols.swift
解決策
1. 実際のシンボル名を使用
public static let editImage = Image(.edit) // editImageアセット用
public static let noImage = Image(.no) // noImageアセット用
// または明示的に型指定
public static let editImage = Image(ImageResource.edit)
2. アセット名を変更
editImage → imageEdit
noImage → imagePlaceholder
まとめ
Generate Asset Symbolsを使用する際は、「Image」や「Color」で終わるアセット名を避けることで、この問題を回避できます。問題が発生した場合はGeneratedAssetSymbols.swift
で実際のシンボル名を確認してください。
Discussion