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

时间:2015-10-25 05:30:59

标签: 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?.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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尝试更改inputData的message类型,例如:

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
        ...
     }
}