我考虑了很多类似的问题,但是编译器仍然无法接受这个。
Socket Mobile API(使用Objective-C编写)将ISktScanDecodedData传递到Swift中的委托方法中(数据可能是二进制的,这也许是为什么它不作为字符串提供的原因):
func onDecodedData(device: DeviceInfo?, DecodedData d: ISktScanDecodedData?) {
let symbology: String = d!.Name()
let rawData: UnsafePointer<UInt8> = d!.getData()
let rawDataSize: UInt32 = decoded!.getDataSize()
// want a String (UTF8 is OK) or Swifty byte array...
}
在C#中,这段代码将原始数据转换为字符串:
string s = Marshal.PtrToStringAuto(d.GetData(), d.GetDataSize());
在Swift中,我可以使用UnsafeArray
,但之后就卡住了:
let rawArray = UnsafeArray<UInt8>(start: rawData, length: Int(rawDataSize))
另外我看到了String.fromCString
和NSString.stringWithCharacters
,但是这两者都无法接受手头的参数类型。例如,如果我可以将UnsafePointer<UInt8>
转换为UnsafePointer<()>
,那么这个函数就可以使用了(尽管我不确定它是否安全)。
NSData(bytesNoCopy: UnsafePointer<()>, length: Int, freeWhenDone: Bool)
有没有明显的方法从所有这些中获取一个字符串?
Marshal
是做什么的吗?如果有一个d
和s
的十六进制转储示例就更好了。 - zaph