import Foundation
import MobileCoreServices
func checkFileExtension(fileName: NSString){
println(fileName)
var fileExtension:CFStringRef = fileName.pathExtension
println(fileExtension)
var fileUTI:CFStringRef = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
println(fileUTI)
let testBool = UTTypeConformsTo(fileUTI, kUTTypeImage) != 0
if testBool{
println("image")
}
}
我收到此错误
错误:'未管理'不能转换为' CFStringRef'
在第
行var fileUTI:CFStringRef = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,fileExtension,nil)
任何想法?感谢
答案 0 :(得分:20)
UTTypeCreatePreferredIdentifierForTag
传回Unmanaged<CFStringRef>
,因此您需要先从Unmanaged
对象中获取值,然后才能使用它:
var unmanagedFileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
var fileUTI = unmanagedFileUTI.takeRetainedValue()
请注意,我正在调用takeRetainedValue()
,因为UTTypeCreatePreferredIdentifierForTag
正在返回我们负责释放的对象。关于takeRetainedValue()
的评论说:
获取此非托管引用的值作为托管引用和 消耗它的不平衡保留。
当函数返回非托管引用时,这很有用 知道你负责发布结果。
如果您从一个确定不负责释放该对象的函数返回Unmanaged
个对象,请改为呼叫takeUnretainedValue()
。
答案 1 :(得分:0)
我只是想提一下我发布的一个小模块,它以更好的方式处理这种事情。你的例子将成为:
import SwiftUTI
func checkFileExtension(fileURL: URL){
let uti = UTI(withExtension: fileURL.pathExtension)
if uti.conforms(to: .image) {
print("image")
}
}