Как мне преобразовать мой быстрый класс в UnsafePointer, такой как __bridge в target-c
Я пытаюсь реализовать быстрый мост к библиотекам SecureTransport C. Я "думаю", что могу передать что угодно как соединение, если я знаю, как читать вещи из него в моих реализациях sslReadCallback/sslWriteCallback. Это предположение, с которым я работаю. Похоже, это тот случай, когда я рассматриваю определение SSLConnectionRef:
/* 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;
.. чтобы развернуть. Какой быстрый эквивалент этого?
Спасибо большое!
1 ответ
Ответ был здесь:
Как привести себя к типу UnsafeMutablePointer
Так что теперь я делаю следующее:
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.