Swift中的UTTypeCreatePreferredIdentifierForTag和CFStringRef

时间:2014-10-29 16:22:55

标签: swift ios8

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)

任何想法?感谢

2 个答案:

答案 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")
    }
}

可以在这里找到:https://github.com/mkeiser/SwiftUTI