Hello. I am implementing TCP connection in one of my applications. This is my working Swift 2 code:
func openNetworkCommunication()
{
if(self.inputStream != nil && self.outputStream != nil)
{
closeNetworkCommunication()
}
let ipAddress = delegate!.ipAddressString as CFStringRef
let portNumber = delegate?.ipPort
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, ipAddress, portNumber!, &readStream, &writeStream)
self.inputStream = readStream!.takeRetainedValue()
self.outputStream = writeStream!.takeRetainedValue()
self.outputBuffer = delegate?.messageToServer.dataUsingEncoding(NSUTF8StringEncoding) as? NSMutableData
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(theStream : NSStream, handleEvent streamEvent : NSStreamEvent)
{
switch (streamEvent)
{
case NSStreamEvent.None:
print("NSStreamEventNone")
case NSStreamEvent.OpenCompleted:
... code ...
case NSStreamEvent.HasBytesAvailable:
... code ...
case NSStreamEvent.HasSpaceAvailable:
... code ...
case NSStreamEvent.ErrorOccurred:
... code ...
case NSStreamEvent.EndEncountered:
p... code ...
default:
print("Unknown event")
}
}
I have converted the code to Swift 3 and faced two issues:
Question 1:
func openNetworkCommunication()
{
if(self.inputStream != nil && self.outputStream != nil)
{
closeNetworkCommunication()
}
let ipAddress = delegate!.ipAddressString as CFString
let portNumber = delegate?.ipPort
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, ipAddress, portNumber!, &readStream, &writeStream)
self.inputStream = readStream!.takeRetainedValue()
self.outputStream = writeStream!.takeRetainedValue()
self.outputBuffer = delegate?.messageToServer.data(using: String.Encoding.utf8) as? NSMutableData
self.inputStream?.delegate = self
self.outputStream?.delegate = self
self.inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
self.outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
self.inputStream?.open()
self.outputStream?.open()
}
I have a warning here:
self.outputBuffer = delegate?.messageToServer.data(using: String.Encoding.utf8) as? NSMutableData
saying that "Cast from Data? to unrelated type NSMutableData always fails".
How should I treat this situation correctly?
Question 2:
In method:
func stream(theStream : Stream, handleEvent streamEvent : Stream.Event)
the following line:
case Stream.Event.none:
gives an error: "'none' is unavailable, use [] to construct an empty option set". Using Stream.Event.[]: or Stream.Event[]: does not help either. What is the proper way?
Thank you so much!