💬

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の確認方法

  1. プロジェクトをビルド
  2. Xcodeの左側のナビゲーターで「Show the Report navigator」(⌘+9)を選択
  3. 最新のビルドログを展開
  4. 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