【发布时间】:2018-09-02 05:15:44
【问题描述】:
对于上下文:我正在尝试使用非常方便的LibXL。我已经在 Obj-C 和 C++ 中成功使用了它,但现在正试图移植到 Swift。为了更好地支持Unicode,我需要将所有字符串作为wchar_t*发送到LibXL api。
因此,为此我拼凑了以下代码:
extension String {
///Function to convert a String into a wchar_t buffer.
///Don't forget to free the buffer!
var wideChar: UnsafeMutablePointer<wchar_t>? {
get {
guard let _cString = self.cString(using: .utf16) else {
return nil
}
let buffer = UnsafeMutablePointer<wchar_t>.allocate(capacity: _cString.count)
memcpy(buffer, _cString, _cString.count)
return buffer
}
}
对 LibXL 的调用似乎正在工作(获取错误消息的 print 返回“Ok”)。除非我尝试实际写入测试电子表格中的单元格。我得到can't write row 0 in trial version:
if let name = "John Doe".wideChar, let passKey = "mac-f.....lots of characters...3".wideChar {
xlBookSetKeyW(book, name, passKey)
print(">: " + String.init(cString: xlBookErrorMessageW(book)))
}
if let sheetName = "Output".wideChar, let path = savePath.wideChar, let test = "Hello".wideChar {
let sheet: SheetHandle = xlBookAddSheetW(book, sheetName, nil)
xlSheetWriteStrW(sheet, 0, 0, test, sectionTitleFormat)
print(">: " + String.init(cString: xlBookErrorMessageW(book)))
let success = xlBookSaveW(book, path)
dump(success)
print(">: " + String.init(cString: xlBookErrorMessageW(book)))
}
我假设我转换为wchar_t* 的代码不正确。有人可以为我指出正确的方向吗..?
附录:感谢@MartinR 的回答。该块似乎“消耗”了其中使用的任何指针。因此,例如,当使用
编写字符串时("Hello".withWideChars({ wCharacters in
xlSheetWriteStrW(newSheet, destRow, destColumn, wCharacters, aFormatHandle)
})
aFormatHandle 将在writeStr 行执行后变为无效且不可重复使用。需要为每个写命令创建一个新的FormatHandle。
【问题讨论】:
-
在发布问题之前研究您的问题。 stackoverflow.com/questions/31043593/…
-
公平地说,我就是这样做的,这就是我获得扩展名的方式——我应该编辑以显示各种来源。可能您提供的链接没有出现,因为它是 wchar_t 到 String。但它仍然可以使用,所以我会进一步检查。
标签: swift string wchar-t libxl