如何使用UTType在Swift中的条件中进行比较?

ujv3wf0j  于 2022-12-28  发布在  Swift
关注(0)|答案(2)|浏览(147)

我从用户那里得到一个文件夹URL,然后寻找该文件夹中的任何MP3文件,标题中的问题本身,我只是想在过程中使用UTType
正如你所看到的,我在代码中采取了所有的步骤,只需要在isMP3函数中的最后一步来完成这个难题。那么我如何使用一个路径或URL,并找出它的UTType,并使用它进行比较呢?
同样在我的方法中,Xcode给出了一个错误,并说:
在范围中找不到“UTType”
不知道为什么我有这个错误,通常它不应该是大小写,因为它是苹果定义的类型。

struct ContentView: View {
    @State private var fileImporterIsPresented: Bool = false
    var body: some View {
        
        Button("Select your Folder") { fileImporterIsPresented = true }
            .fileImporter(isPresented: $fileImporterIsPresented, allowedContentTypes: [.folder], allowsMultipleSelection: false, onCompletion: { result in
                
                switch result {
                case .success(let urls):
                    
                    if let unwrappedURL: URL = urls.first {
                        
                        if let contents = try? FileManager.default.contentsOfDirectory(atPath: unwrappedURL.path) {
                            
                            contents.forEach { item in
                                if isMP3(path: unwrappedURL.path + "/" + item) {
                                    print(item)
                                }
                            }
                            
                        }
                        
                    }
                    
                case .failure(let error):
                    print("Error selecting file \(error.localizedDescription)")
                }
                
            })
        
    }
}

func isMP3(path: String) -> Bool {
    // trying use UTType here
    if URL(fileURLWithPath: path).??? == UTType.mp3 {
        return true
    }
    else {
        return false
    }
}
tcomlyy6

tcomlyy61#

要使用UTType,必须导入显式包

import UniformTypeIdentifiers

它可以是这样的

func isMP3(path: String) -> Bool {
    if let type = UTType(filenameExtension: URL(fileURLWithPath: path).pathExtension), type == UTType.mp3 {
        return true
    }
    else {
        return false
    }
}
dgenwo3n

dgenwo3n2#

下面是另一个使用URLResourceValues.contentType并回退到UTType(filenameExtension:)的解决方案:

import UniformTypeIdentifiers

func isMP3(path: String) -> Bool {
    if let contentType = URL(fileURLWithPath: path).contentType,
       contentType.conforms(to: .mp3)
    {
        return true
    }
    else {
        return false
    }
}

extension URL {
    var contentType: UTType? {
        if let resourceValues = try? resourceValues(forKeys: [.contentTypeKey]),
           let contentType = resourceValues.contentType {
            return contentType
        } else if let contentType = UTType(filenameExtension: pathExtension) {
            return contentType
        } else {
            return nil
        }
    }    
}

相关问题