需要在Swift中进行CConstPointer转换的NSMutableData

时间:2014-06-19 09:19:17

标签: ios7 swift

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

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<Uint8>。有关正确转换的任何提示吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

来自Swift&amp; Objc interop book部分:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithCAPIs.html

  

C常量指针

     

当一个函数被声明为采用CConstPointer参数时,   它可以接受以下任何一种:

     
      
  • nil,作为空指针传递
  •   
  • CMutablePointer,CMutableVoidPointer,CConstPointer,CConstVoidPointer或AutoreleasingUnsafePointer值,其中
      如有必要,将转换为CConstPointer
  •   
  • 一个输入输出表达式,其操作数是Type类型的左值,它作为左值的地址传递
  •   
  • 一个Type []值,作为指向数组开头的指针传递,并在调用期间延长生命周期
  •   

我相信它可以像这样工作:

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

答案 2 :(得分:0)

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

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(ptpMessage.dataUsingEncoding(NSUTF16LittleEndianStringEncoding))

outputStream.write(UnsafePointer<UInt8>(pData.bytes), maxLength: pData.length)

@holex:感谢您的意见。我知道这个解决方案并不是很好,但它现在正在运作。