我正在尝试实现一个到SecureTransport C库的swift桥接。我"认为"只要我知道如何在我的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;
打开包装。这有什么快速的等价物?
非常感谢!
答案在这里:
如何将self强制转换为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。