2015-04-10 10 views
9

पर एक स्विफ्ट स्ट्रक्चर कास्ट करें क्या एक स्विफ्ट स्ट्रक्चर का पता एक शून्य UnsafeMutablePointer पर डालने का कोई तरीका है?
मैं सफलता के बिना इस की कोशिश की:UnsafeMutablePointer <Void>

struct TheStruct { 
    var a:Int = 0 
} 

var myStruct = TheStruct() 
var address = UnsafeMutablePointer<Void>(&myStruct) 

धन्यवाद!

संपादित करें: संदर्भ
मैं वास्तव में पहला उदाहरण स्विफ्ट के लिए बंदरगाह के लिए कोशिश कर रहा हूँ लर्निंग CoreAudio में।
यह मैं अब तक क्या किया है है:

func myAQInputCallback(inUserData:UnsafeMutablePointer<Void>, 
    inQueue:AudioQueueRef, 
    inBuffer:AudioQueueBufferRef, 
    inStartTime:UnsafePointer<AudioTimeStamp>, 
    inNumPackets:UInt32, 
    inPacketDesc:UnsafePointer<AudioStreamPacketDescription>) 
{ } 

struct MyRecorder { 
    var recordFile:  AudioFileID = AudioFileID() 
    var recordPacket: Int64  = 0 
    var running:  Boolean  = 0 
} 

var queue:AudioQueueRef = AudioQueueRef() 
AudioQueueNewInput(&asbd, 
    myAQInputCallback, 
    &recorder, // <- this is where I *think* a void pointer is demanded 
    nil, 
    nil, 
    UInt32(0), 
    &queue) 

मैं स्विफ्ट में रहने के लिए प्रयासों को कर रहा हूँ, लेकिन अगर यह पता चला है और अधिक एक फायदा तुलना में एक समस्या हो, मैं एक सी समारोह को जोड़ने खत्म हो जाएगा ।

संपादित करें: bottome लाइन
आप इस प्रश्न के लिए आया था क्योंकि आप स्विफ्ट में एक CoreAudio के AudioQueue उपयोग करने के लिए कोशिश कर रहे हैं ... नहीं है। ,

var myStruct = TheStruct() 
var address = withUnsafeMutablePointer(&myStruct) {UnsafeMutablePointer<Void>($0)} 

लेकिन क्यों आप इस की जरूरत है:

+0

क्या आप कुछ जानकारी जोड़ सकते हैं * क्यों * एक शून्य सूचक के रूप में पता आवश्यक है? –

+0

ज़रूर! मैं स्विफ्ट में कोरऑडियो का उपयोग करने की कोशिश कर रहा हूं। संकलक शिकायत करता है कि AudioQueueNewInput पर दिए गए तर्क वे नहीं हैं, और पारित संरचना उस कारण का कारण बनती है। – popisar

+0

आपको प्रश्न में अधिक जानकारी और कोड जोड़ना चाहिए। वास्तव में कौन सा फ़ंक्शन, आप इसे कॉल करने का प्रयास कैसे करते हैं, सटीक त्रुटि संदेश ... –

उत्तर

11

जहाँ तक मुझे पता है, सबसे छोटा रास्ता है (विवरण के लिए टिप्पणियां पढ़ें)? यदि आप इसे पैरामीटर के रूप में पास करना चाहते हैं, तो आप (और चाहिए):

func foo(arg:UnsafeMutablePointer<Void>) { 
    //... 
} 

var myStruct = TheStruct() 
foo(&myStruct) 
+2

के साथ इसे लागू न करने के लिए महान सलाह के लिए धन्यवाद पहला संस्करण वास्तव में असुरक्षित है क्योंकि सूचक का उपयोग 'myStruct' के जीवनकाल से परे किया जा सकता है। - यदि पॉइंटर को तर्क के रूप में जरूरी है सी समारोह तो 'withUnsafeMutablePointer (और myStruct) {someCFunction (UnsafeMutablePointer ($ 0))}' भी एक विकल्प है। –

+0

हम 'पारित कर सकते हैं UnsafeMutablePointer ' के रूप में 'UnsafeMutablePointer '। तो 'withUnsafeMutablePointer (और myStruct) {someCFunction ($ 0)} 'यह भी काम करता है। – rintaro

+1

@ मार्टिनआर इस प्रकार के नाम में "असुरक्षित" क्यों है :) – Kirsteins

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