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
相关产品推荐
相关产品推荐

