Ios7 NSMutableData需要在Swift中转换为CConstPointer

Ios7 NSMutableData需要在Swift中转换为CConstPointer,ios7,swift,Ios7,Swift,从Objective-C重写以下Swift代码(将字节写入流): var outputStream : NSOutputStream = NSOutputStream() var pData : NSMutableData = NSMutableData() var pType : Int = 1 let pMessage : String = "Device_Description\0\0\x01" // 16BitChar with escapeSequence var pLength :

从Objective-C重写以下Swift代码(将字节写入流):

var outputStream : NSOutputStream = NSOutputStream()
var pData : NSMutableData = NSMutableData()
var pType : Int = 1
let pMessage : String = "Device_Description\0\0\x01" // 16BitChar with escapeSequence
var pLength : Int = 8+pMessage.lengthOfBytesUsingEncoding(NSUTF16LittleEndianStringEncoding)

pData.appendBytes(&pLength, length: 4)
pData.appendBytes(&pType, length: 4)
pData.appendData((pMessage as NSString).dataUsingEncoding(NSUTF16LittleEndianStringEncoding))

outputStream.write(pData.bytes, maxLength: pData.length)

pData.bytes
属于
COpaquePointer
类型,但写入操作需要
CConstPointer
。有关于正确转换的提示吗?提前感谢。

来自Swift&Objc互操作手册部分:

C常量指针

当函数声明为接受CConstPointer参数时, 它可以接受以下任何一项:

  • nil,作为空指针传递
  • CMutablePointer、CMutableVoidPointer、CConstPointer、CConstVoidPointer或AutoreleasingUnsafePointer值,这些值
    如有必要,将转换为CConstPointer
  • 一种输入输出表达式,其操作数是类型为的左值,作为左值的地址传递
  • 类型[]值,作为指向数组开头的指针传递,并在调用期间延长生存期
我相信它可以这样工作:

var p: [Uint8] = []
pData.getBytes(&p)
outputStream.write(p, maxLength: pData.length)

我现在通过使用
UnsafePointer()
,找到了一个简单的解决方案:

var outputStream:NSOutputStream=NSOutputStream()
var pData:NSMutableData=NSMutableData()
变量类型:Int=1
让pMessage:String=“Device\u Description\0\0\x01”//16位字符带转义序列
var pLength:Int=8+pMessage.LengthofBytes使用编码(NSUTF16LittleEndianStringCodeing)
pData.appendBytes(&plungth,长度:4)
pData.appendBytes(&p类型,长度:4)
pData.appendData(ptpMessage.dataUsingEncoding(nsutf16littleendianstringecoding))
outputStream.write(非安全指针(pData.bytes),maxLength:pData.length)

@谢谢你的意见。我知道这个解决方案不是很快,但它目前正在工作。

正如Jack wu所概述的,但有些不完整,以下代码的工作原理与使用UnsafePointer选项相同:

var byteData = [UInt8]()
pData.getBytes(&byteData)
self.outputStream!.write(byteData, maxLength: pData.length)

你可能需要完全颠倒逻辑。。。首先,您应该使用
CConstPointer
为流创建一个缓冲区,然后您可以初始化
NSData
将该缓冲区传递给它。这种逻辑比你尝试过的方式更接近斯威夫特的精神。你认为猜测是你的盟友吗?给出的4行代码充满了语法和逻辑错误。。。。
var byteData = [UInt8]()
pData.getBytes(&byteData)
self.outputStream!.write(byteData, maxLength: pData.length)