Как мне преобразовать мой быстрый класс в 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 в 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.

Другие вопросы по тегам