gpt4 book ai didi

swift - 如何将此 char* 转换为 String 可选?使用 LibXL 中的 xlSheetReadStrA,检查空单元格

转载 作者:行者123 更新时间:2023-11-28 14:22:14 24 4
gpt4 key购买 nike

这是在框架 header 中声明的签名:

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* 返回并将其转换为 String,这是结果:

(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
}

试试看会发生什么。

关于swift - 如何将此 char* 转换为 String 可选?使用 LibXL 中的 xlSheetReadStrA,检查空单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51831619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com