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

时间:2018-08-13 22:57:01

标签: swift casting libxl

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

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返回值的原始转换可能会更有效,这将消除对以下检查的需要

1 个答案:

答案 0 :(得分:1)

我从未使用过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
}

只需尝试看看会发生什么。