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

मैं इस त्रुटि मिलती हैUTTypeCreatePreferredIdentifierForTag और CFStringRef स्विफ्ट में

त्रुटि: 'अप्रबंधित' को 'CFStringRef'

लाइन पर

वर fileUTI परिवर्तनीय नहीं है: CFStringRef = UTTypeCreatePreferredIdentifierForTag (kUTTagClassFilenameExtension, fileExtension, nil)

कोई विचार ?? धन्यवाद

उत्तर

15

UTTypeCreatePreferredIdentifierForTag वापस एक Unmanaged<CFStringRef> गुजरता है, तो आप Unmanaged वस्तु से लाभ प्राप्त करने के लिए इससे पहले कि आप उपयोग कर सकते हैं की जरूरत है:

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

ध्यान दें कि मैं takeRetainedValue()UTTypeCreatePreferredIdentifierForTag के बाद से फोन कर रहा हूँ एक वस्तु लौट जाता है कि हम जारी करने के लिए जिम्मेदार हैं। takeRetainedValue() पर टिप्पणी कहते हैं:

एक प्रबंधित संदर्भ के रूप में इस अप्रबंधित संदर्भ का मूल्य प्राप्त करें और उपभोग एक असंतुलित इसके बारे में बरकरार रहती है।

यह तब उपयोगी होता है जब कोई फ़ंक्शन एक अप्रबंधित संदर्भ देता है और आप जानते हैं कि आप परिणाम जारी करने के लिए ज़िम्मेदार हैं।

आप एक Unmanaged वस्तु एक समारोह जहां आप वाकई उस वस्तु को रिहा करने के लिए जिम्मेदार नहीं हैं से वापस मिलता है, takeUnretainedValue() बजाय कहते हैं।

+8

बनाम takeUnretainedValue takeRetainedValue की पसंद ही निर्भर करता है कोर फाउंडेशन फ़ंक्शन एक (+1) वस्तु बनी रहती हैं, इस पर (मैं डॉक्स को समझने के रूप में) नहीं। UTTypeCreatePreferredIdentifierForTag() के नाम पर "बनाएं" है, इसलिए स्मृति प्रबंधन नियमों के अनुसार जो एक (+1) बनाए गए ऑब्जेक्ट को लौटाता है जिसे कॉलर को अंततः रिलीज़ करना होता है। तो आपको यहां ले लिया गया है वेलेंटाइवल, अन्यथा ऑब्जेक्ट कभी जारी नहीं होगा और आपके पास रिसाव होगी। –

+2

https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html में "नियम बनाएं" की तुलना करें। –

+0

व्यापक उत्तर के लिए धन्यवाद! वास्तव में मेरी मदद की! – pbeo

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

संबंधित मुद्दे