Ios 致命错误:在展开可选值时发现意外的nil

Ios 致命错误:在展开可选值时发现意外的nil,ios,macos,swift,Ios,Macos,Swift,整个代码如下所示: var inputStream :NSInputStream? var outputStream:NSOutputStream? NSStream.getStreamsToHostWithName(ip, port: port, inputStream: &inputStream, outputStream: &outputStream) let reader = inputStream let writer = outputStream writer?.op

整个代码如下所示:

var inputStream :NSInputStream?
var outputStream:NSOutputStream?
NSStream.getStreamsToHostWithName(ip, port: port, inputStream: &inputStream, outputStream: &outputStream)
let reader = inputStream
let writer = outputStream
writer?.open()
reader?.open()
var message : UInt8 = 0
while reader!.read(&message, maxLength: 1)>0
{
    let wa = NSString(bytes: &message, length: 1, encoding: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue))) as! String
}
当我收到的消息是汉字时,最后一行抛出以下内容: 致命错误:在展开可选值时意外发现nil,同时消息的值为196

有人知道如何解决这个问题吗?

根据,如果读取的字节在0x81-0xfe范围内,字符将使用两个或四个字节进行编码,因此仅尝试解码第一个字节将失败。
NSString
构造函数将返回nil,尝试将其展开(使用
as!String
)将抛出该错误


您需要检查读取的字节,如果需要,根据第一个字节读取另一个字节。然后您需要检查第二个字节,并可能再读取两个字节。最后,您需要在单个缓冲区中将所有一个、两个或四个字节传递给
NSString
构造函数。

尝试更改输入数据的
消息类型,例如:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {
    let bufferSize = 1024
    var message = Array<UInt8>(count:bufferSize, repeatedValue: 0)
    while true {
        let bytesRead = self.inputStream!.read(&message, maxLength: bufferSize)
        let responseString = NSString(bytes: message, length: message.count, encoding: NSUTF8StringEncoding) as! String
        // Do somthing with response
        ...
     }
}
let queue=dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u默认值,0)
调度异步(队列){
让bufferSize=1024
var消息=数组(计数:bufferSize,repeatedValue:0)
虽然是真的{
让bytesRead=self.inputStream!.read(&message,maxLength:bufferSize)
让responseString=NSString(字节:message,长度:message.count,编码:NSUTF8StringEncoding)作为!字符串
//做些有反应的事
...
}
}

该消息表示您的值为零,但您使用!,这就产生了一个异常。我怀疑之所以为nil是因为您提供的值无法使用指定的编码转换为字符串。我本以为编码至少需要两个字节,但我不确定。