2014-10-29 16 views
5
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") 
    } 
} 

ottengo questo erroreUTTypeCreatePreferredIdentifierForTag e CFStringRef a Swift

errore: 'gestito' non è convertibile in 'CFStringRef'

alla linea

var fileUTI: CFStringRef = UTTypeCreatePreferredIdentifierForTag (kUTTagClassFilenameExtension, fileExtension, nil)

qualche idea ?? Grazie

risposta

15

UTTypeCreatePreferredIdentifierForTag passa indietro un Unmanaged<CFStringRef>, quindi è necessario per ottenere il valore di oggetto Unmanaged prima di poter utilizzare:

var unmanagedFileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil) 
var fileUTI = unmanagedFileUTI.takeRetainedValue() 

Si noti che sto chiamando takeRetainedValue() dal UTTypeCreatePreferredIdentifierForTag sta tornando un oggetto che siamo responsabili del rilascio. I commenti su takeRetainedValue() dicono:

ottenere il valore di questo riferimento non gestito come riferimento gestito e consumano una squilibrata conservano di esso.

Questo è utile quando una funzione restituisce un riferimento non gestito e voi sapere che siete responsabili per il rilascio del risultato.

Se si ottiene un oggetto Unmanaged di ritorno da una funzione in cui si è sicuri di non sono responsabili dello sblocco quell'oggetto, chiamare takeUnretainedValue() invece.

+8

La scelta di takeRetainedValue vs takeUnretainedValue dipende solo (se ho capito la documentazione) in merito alla funzione di nucleo Fondazione restituisce un (1) trattenuta oggetto o non. UTTypeCreatePreferredIdentifierForTag() ha "Crea" nel suo nome, quindi in base alle regole di gestione della memoria che restituisce un oggetto (+1) mantenuto che il chiamante deve rilasciare alla fine. Quindi devi chiamare takeRetainedValue qui, altrimenti l'oggetto non verrebbe mai rilasciato e avrai una perdita. –

+2

Confronta "Crea regola" in https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html. –

+0

grazie per la risposta completa! mi ha davvero aiutato! – pbeo

0

Voglio solo menzionare un piccolo modulo che ho pubblicato che tratta esattamente questo tipo di cose in un modo molto più carino. Il vostro esempio diventerebbe:

import SwiftUTI 

func checkFileExtension(fileURL: URL){ 

    let uti = UTI(withExtension: fileURL.pathExtension) 

    if uti.conforms(to: .image) { 

     print("image") 
    } 
} 

E 'disponibile qui: https://github.com/mkeiser/SwiftUTI