You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI新手求助:Assets文件夹内图片名称获取返回空数组问题

为啥你的代码返回空数组?

Bundle.main.paths(forResourcesOfType:inDirectory:) 只能找项目里真实存在的文件系统文件夹,但你在Assets.xcassets里建的"folder"是资源分组,不是磁盘上的真实目录——编译后这些图片会被打包成一个叫Assets.car的文件,根本没法用文件路径的方式找到它们。

两种解决办法

办法1:把图片移到项目真实文件夹(新手首选)

  1. 在项目里新建一个文件夹(比如叫ImagesFolder),选择「Folder Reference」(蓝色那种文件夹),把jpg图片拖进去,记得勾选「Copy items if needed」,还要确保关联到你的App target。
  2. 改代码里的目录名成这个真实文件夹的名字就行:
func getPhotoNames() -> [String] {
    let assetPaths = Bundle.main.paths(forResourcesOfType: "jpg", inDirectory: "ImagesFolder")
    print(assetPaths)
    return assetPaths.map { URL(fileURLWithPath: $0).deletingPathExtension().lastPathComponent }
}

这样就能正常拿到图片名称数组了。

办法2:保留在Assets里,用Asset Catalog API获取(进阶)

如果必须把图片放在Assets的分组里,iOS 14及以上可以用系统的NSAssetCatalog来遍历资源,代码示例:

import UIKit

func getAssetCatalogImageNames(inFolder folderName: String) -> [String] {
    guard let catalogURL = Bundle.main.url(forResource: "Assets", withExtension: "car") else {
        return []
    }
    
    do {
        let catalog = try NSAssetCatalog(url: catalogURL)
        // 筛选出指定分组下的资源
        let assets = catalog.assetNames.filter { $0.hasPrefix("\(folderName)/") }
        // 去掉分组前缀,只留图片名称
        return assets.map { $0.replacingOccurrences(of: "\(folderName)/", with: "") }
    } catch {
        print("解析Asset Catalog失败: \(error.localizedDescription)")
        return []
    }
}

要是你需要兼容iOS 14以下的版本,这个办法就用不了了。

额外提醒
  • 一定要确认图片的「Target Membership」已经勾选,不然打包的时候不会把图片放进App里。
  • 用办法1的话,文件夹名字要和代码里inDirectory的参数完全一致,大小写也不能错。

内容的提问来源于stack exchange,提问作者ole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:22:04