2016-05-26 2 views
1

Я пытаюсь реализовать быстрый мост в библиотеках C SecureTransport. Я думаю: «Я могу передать что-либо как соединение, пока я знаю, как читать данные из него в моих реализациях sslReadCallback/sslWriteCallback. Это предположение, с которым я работаю. Это, кажется, тот случай, когда я рассматриваю определение SSLConnectionRef:Как преобразовать мой класс swift в UnsafePointer, как __bridge в объекте-c

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

Так что я просто нужно, чтобы превратить свой класс в UnsafePointer. К сожалению, компилятор мне не нравится. Может ли кто-нибудь дать мне советы?

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) 
    } 
} 

В GCDAsyncSocket, он делает это:

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

и

SubZeroGCDAsyncSocket *asyncSocket = (__bridge SubZeroGCDAsyncSocket *)connection; 

.. разворачивать. Каков быстрый эквивалент этого?

Большое спасибо!

ответ

0

Ответ был здесь:

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

Так что теперь я делаю следующее:

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) 
    } 
} 

И я разворачивать, как это:

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

Подставить свой собственный тип для SecureTransportWrapper.