Swift 5如何获取当前行号?生成带计算式CSV遇指令报错
解决Swift中生成带Excel公式的CSV键值对问题
首先明确:Swift的#line指令已被移除,替换为#sourceLocation,但#sourceLocation仅用于手动设置源文件位置信息,无法自动获取当前代码行号,所以你原来依赖代码行号的思路走不通,得换个方式实现需求。
你的核心需求是:根据结构体字段在CSV中的列位置,生成Excel的单元格引用公式(比如净利润=收入-支出)。可以直接通过字段的索引位置来对应Excel列,无需依赖编译指令的行号,具体实现如下:
struct FinanceSummary { var expense: Decimal var revenue: Decimal func keyPairs(row: Int) -> KeyValuePairs<String, String> { // 定义字段列表:(字段名, 值生成逻辑) let fieldDefinitions: [(String, () -> String)] = [ ("expense", { "\(self.expense)" }), ("revenue", { "\(self.revenue)" }), ("income", { // revenue是第2个字段(索引1)对应B列,expense是第1个(索引0)对应A列 let revenueColumn = columnLetter(fromIndex: 1) let expenseColumn = columnLetter(fromIndex: 0) return "=\(revenueColumn)\(row) - \(expenseColumn)\(row)" }) ] // 转换为KeyValuePairs return KeyValuePairs(uniqueKeysWithValues: fieldDefinitions.map { ($0.0, $0.1()) }) } // 辅助方法:将索引转换为Excel列字母(0→A,1→B,26→AA等) private func columnLetter(fromIndex index: Int) -> String { var currentIndex = index var result = "" while currentIndex >= 0 { let remainder = currentIndex % 26 result = String(UnicodeScalar(65 + remainder)!) + result currentIndex = (currentIndex / 26) - 1 } return result } }
说明:
- 用
fieldDefinitions数组明确字段顺序和对应的值生成逻辑,每个字段的索引直接对应Excel列的位置(索引0=A列,1=B列...) - 新增
columnLetter(fromIndex:)方法,将索引转换为Excel的列字母(支持超过26列的情况,比如26→AA,27→AB) - 生成公式时,直接通过索引获取对应列字母,结合传入的
row参数,就能得到正确的单元格引用(比如row=1时,公式为=B1-A1)
这种方式比依赖代码行号更可靠,代码结构也更清晰,不会因为代码换行、调整顺序导致公式出错。
内容的提问来源于stack exchange,提问作者ScottyBlades
相关产品推荐
相关产品推荐

