我正在将一个应用程序从Objective-C移植到Swift,我需要使用以下方法:
CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \ readStream: CMutablePointer<Unmanaged<CFReadStream>?>, \ writeStream: CMutablePointer<Unmanaged<CFWriteStream>?>)
原来的逻辑看起来像这样(几个网站似乎对此表示同意):
CFReadStreamRef readStream = NULL; CFWriteStreamRef writeStream = NULL; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, \ &readStream, &writeStream); NSInputStream inputStream = (__bridge_transfer NSInputStream *)readStream; NSOutputStream outputStream = (__bridge_transfer NSOutputStream *)writeStream;
借助免费的桥接功能,效果很好。但是,“快速空间”中不存在ARC,并且类型系统已更改。
如何将流转换为
CMutablePointer<Unmanaged<CFReadStream>?>, and CMutablePointer<Unmanaged<CFWriteStream>?>
然后NSStream在CFStreamCreatePairWithSocketToHost调用之后将它们转换回子类?
NSStream
CFStreamCreatePairWithSocketToHost
我可以使用它,这是我的代码:确保在某处保留连接类的引用:-)
class Connection : NSObject, NSStreamDelegate { let serverAddress: CFString = "127.0.0.1" let serverPort: UInt32 = 8443 private var inputStream: NSInputStream! private var outputStream: NSOutputStream! func connect() { println("connecting...") var readStream: Unmanaged<CFReadStream>? var writeStream: Unmanaged<CFWriteStream>? CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream) // Documentation suggests readStream and writeStream can be assumed to // be non-nil. If you believe otherwise, you can test if either is nil // and implement whatever error-handling you wish. self.inputStream = readStream!.takeRetainedValue() self.outputStream = writeStream!.takeRetainedValue() self.inputStream.delegate = self self.outputStream.delegate = self self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.inputStream.open() self.outputStream.open() } func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) { println("stream event") } }