2016-05-26 14 views
1

Ich versuche, eine schnelle Brücke zu den SecureTransport C-Bibliotheken zu implementieren. Ich denke, ich kann alles als Verbindung weiterleiten, solange ich weiß, wie man in meiner sslReadCallback/sslWriteCallback-Implementierung etwas davon liest. Dies ist die Annahme, mit der ich arbeite. Dies scheint der Fall zu sein, wenn ich die Definition von SSLConnectionRef anzuzeigen:Wie konvertiere ich meine swift-Klasse in einen unsafePointer wie die __bridge in objective-c

/* Opaque reference to an I/O connection (socket, endpoint, etc.) */ 
public typealias SSLConnectionRef = UnsafePointer<Void> 

Also brauche ich nur meine Klasse in UnsafePointer zu drehen. Leider mag der Compiler meine Versuche nicht. Kann mir jemand Tipps geben?

func startSSLProcess() 
{ 
    self.sslContext = SSLCreateContext(kCFAllocatorDefault, SSLProtocolSide.ClientSide, SSLConnectionType.StreamType) 
    if let sslContext = self.sslContext 
    { 
     SSLSetIOFuncs(sslContext, sslReadCallback, sslWriteCallback) 
     SSLSetConnection(sslContext, UnsafePointer(self)) // <-- error 
     SSLSetSessionOption(sslContext, SSLSessionOption.BreakOnClientAuth, true) 
     SSLHandshake(sslContext) 
    } 
} 

In GCDAsyncSocket, tut es dies:

status = SSLSetConnection(sslContext, (__bridge SSLConnectionRef)self); 

und

SubZeroGCDAsyncSocket *asyncSocket = (__bridge SubZeroGCDAsyncSocket *)connection; 

.. auszupacken. Was ist das schnelle Äquivalent davon?

Vielen Dank!

Antwort

0

Die Antwort war hier:

How to cast self to UnsafeMutablePointer<Void> type in swift

ich also tun jetzt folgende Möglichkeiten:

func startSSLProcess() 
{ 
    self.sslContext = SSLCreateContext(kCFAllocatorDefault, SSLProtocolSide.ClientSide, SSLConnectionType.StreamType) 
    if let sslContext = self.sslContext 
    { 
     SSLSetIOFuncs(sslContext, sslReadCallback, sslWriteCallback) 
     SSLSetConnection(sslContext, UnsafePointer(Unmanaged.passUnretained(self).toOpaque())) 
     SSLSetSessionOption(sslContext, SSLSessionOption.BreakOnClientAuth, true) 
     SSLHandshake(sslContext) 
    } 
} 

Und ich auspacken wie folgt aus:

let transportWrapper:SecureTransportWrapper = Unmanaged<SecureTransportWrapper>.fromOpaque(COpaquePointer(connection)).takeUnretainedValue() 

Ihre eigene Art Ersatz für SecureTransportWrapper.