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

Swift中如何在条件判断中使用UTType进行类型比较?

问题修复方案

1. 解决Cannot find 'UTType' in scope报错

  • 报错原因:UTType属于UniformTypeIdentifiers框架下的类型,没有引入对应框架时就会触发作用域找不到的错误,在代码文件顶部添加导入语句即可修复:
import UniformTypeIdentifiers

2. 补全isMP3类型判断逻辑

UTType判断不要仅依赖文件后缀,优先读取文件实际内容类型做校验,同时用conforms(to:)做类型兼容判断,覆盖所有符合MP3规范的文件,补全后的函数代码如下:

func isMP3(path: String) -> Bool {
    let fileURL = URL(fileURLWithPath: path)
    // 优先读取文件实际内容类型
    guard let fileType = try? fileURL.resourceValues(forKeys: [.contentTypeKey]).contentType else {
        // 读取失败时回退到后缀判断
        guard let extType = UTType(filenameExtension: fileURL.pathExtension) else {
            return false
        }
        return extType == .mp3
    }
    // 做类型兼容判断,避免漏判符合MP3规范的变种文件
    return fileType.conforms(to: .mp3)
}

3. 原有代码的沙盒权限修复

你当前用fileImporter选中的文件夹属于系统安全作用域资源,直接调用FileManager读取会因为权限失败,需要先申请访问权限,同时不要手动拼接路径字符串,避免路径格式错误,替换原有success分支的代码即可:

case .success(let urls):
    guard let folderURL = urls.first else { return }
    // 申请安全作用域访问权限
    guard folderURL.startAccessingSecurityScopedResource() else {
        print("Failed to get folder access permission")
        return
    }
    // 方法结束时自动释放权限
    defer { folderURL.stopAccessingSecurityScopedResource() }
    
    // 遍历目录时直接获取URL,不手动拼接路径
    guard let fileURLs = try? FileManager.default.contentsOfDirectory(
        at: folderURL,
        includingPropertiesForKeys: [.contentTypeKey],
        options: .skipsHiddenFiles
    ) else {
        print("Failed to read folder content")
        return
    }
    
    fileURLs.forEach { fileURL in
        if isMP3(path: fileURL.path) {
            print("Found MP3 file: \(fileURL.lastPathComponent)")
        }
    }

注意:如果需要递归遍历子文件夹下的所有MP3,把contentsOfDirectory替换为enumerator(at:includingPropertiesForKeys:options:errorHandler:)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:48:22