以下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>
。有关正确转换的任何提示吗?提前谢谢。
答案 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:感谢您的意见。我知道这个解决方案并不是很好,但它现在正在运作。