swift - 如何将此 char* 转换为可选的字符串?使用 LibXL 中的 xlSheetReadStrA,检查空单元格
问题描述
这是框架标头中声明的签名:
const char* XLAPIENTRY xlSheetReadStrA(SheetHandle handle, int row, int col, FormatHandle* format);
这是 ReadStr 的文档: http ://www.libxl.com/spreadsheet.html
这是我们当前读取单元格的方式:
func readNillableString(row:Int32, col:Int32) -> String? {
let value:String? = String(format: "%s", xlSheetReadStrA(sheet, row, col, nil) ?? "").trimmingCharacters(in: .whitespacesAndNewlines)
let set = NSMutableCharacterSet.alphanumeric()
set.addCharacters(in: "., +%%()/[]:-_ ®÷")
if self.rangeOfCharacter(from: set.inverted) != nil || self.isEmpty {
return nil
}
if value?.isEmpty == true {
return nil
}
return value
}
但实际上,我们要做的只是将 excel 单元格中的值转换为 Swift 字符串
主要问题是空单元格,当我们调用xlSheetReadStrA
一个空单元格并将其char*
返回并将其转换为 aString
时,结果如下:
(lldb) po value
▿ Optional<String>
- some : "hÿh\u{03}\u{01}"
看起来我们正在做很多不必要的错误处理,当我们基本上只是想要一种方法来快速返回一个值,如果有String
一个值,nil
如果没有
该rangeOfCharacter
调用只是确定单元格是否为空的一种方法......
有没有人有任何 LibXL 经验,或者可以查看这个解析代码并找到更好的方法来做到这一点?我认为返回值的原始转换可能会更有效char* xlSheetReadStrA
,这将消除对以下检查的需要
解决方案
我从未使用过 LibXL,但您的代码无法nil
正确处理案例。
尝试这样的事情:
func readNillableString(row:Int32, col:Int32) -> String? {
guard let cStr = xlSheetReadStrA(sheet, row, col, nil) else {
return nil
}
let value = String(cString: cStr).trimmingCharacters(in: .whitespacesAndNewlines)
if value.isEmpty {
return nil
}
return value
}
试试看会发生什么。
推荐阅读
- flutter - 为什么 java: 包 io.flutter.plugins.googlesignin 不存在?
- html - Timepicker - 将当前时间设置为默认值
- react-native - 我可以用本机反应在静态方法中设置状态吗?
- java - 调用 init 方法失败;第二个一对多的嵌套异常
- javascript - 不变违规:文本字符串必须在
零件 - excel - VBA从一张表复制所有行并将其粘贴到新表n次
- c# - 在 C# 中使用 CMD 命令来显示任务列表
- java - 如何为锯齿状数组 java 覆盖 next()?
- c++ - 编写一个 C++ 计算器程序,它运行的实例比需要的多一个
- ionic3 - 如何使用cordova-plugin-googleplus修复谷歌登录错误16?