【发布时间】:2017-02-15 07:15:09
【问题描述】:
我有一个简单的结构。
struct Transaction {
var value: String = ""
var date: String = ""
var title: String = ""
}
在我的项目中,Transaction 是这样使用的......
var transaction:Transaction = Transaction()
//loops 3 times
repeat {
let parsed = stringAndType(from:myParser)//-> (string:String, type:UInt8)
switch parsed.type {
case 1:
print("1 -- \(parsed.string")
transaction.value = parsed.string
case 2:
print("2 -- \(parsed.string)")
transaction.date = parsed.string
case 4:
print("4 -- \(parsed.string)")
transaction.title = parsed.string
default: break
}
} while myParser.isOk
print("Returning transaction: \(transaction)")
return transaction
在这段代码中,创建了一个结构。解析器将数据提供给交换机,交换机将解析后的字符串分配给适当的Transaction 变量。当我运行以下代码时,输出表明对transaction.date 和transaction.value 的分配没有坚持。
输出:
2 -- 12/22/2015
1 -- -5.00
4 -- RECURRING PAYMENT BACKBLAZE
Returning transaction: Transaction(value: "", date: "", title: "RECURRING PAYMENT BACKBLAZE")
stringAndType() 的幕后有复杂的缓冲。以 C 程序员的身份看待这个问题,我真的很想认为这个函数可能是问题所在。但是,我的印象是 Swift 字符串是结构体,因此是在写入时复制的,就像整数或双精度数一样。希望您能提供见解。感谢您的宝贵时间。
2017 年 2 月 15 日更新
此代码中的逻辑按预期运行。我认为这里的问题是内存管理。为了帮助推动这一点,我已经...
- 从我的交换机中删除了
print行 - 为
Transaction中的每个变量添加了didSet {}
就这样……
struct Transaction {
var value: String = "" {
didSet {
print("The VALUE has changed from \(oldValue) to \(value)")
}
}
//this is repeated appropriately for the other two variables
}
给定的输出排除了任何逻辑问题。输出:
The DATE has changed from to 12/22/2015
The VALUE has changed from to -5.00
The TITLE has changed from to RECURRING PAYMENT BACKBLAZE
Returning transaction: Transaction(value: "", date: "", title: "RECURRING PAYMENT BACKBLAZE")
stringAndType() 确实从不安全的缓冲区中读取,但它将字节复制到Data 结构,并返回从复制的数据初始化的字符串。我认为这会使我免受安全问题的影响...也许String 的实现细节我不见了?
【问题讨论】:
-
我相信它正在进入 switch case 并且将进入分配标题的最后一个 case,而不是
value和date。 -
你为什么认为,你切换 case 会通过 case 1?看起来它从不执行其他案例。
-
当我尝试使用带有字符串值的数组运行您的代码时,一切正常:返回事务:事务(值:“12/22/2015”,日期:“-5.00”,标题:“经常性付款后遗症")
-
你的函数
stringAndType的范围是什么?是本地的吗? IE。与transaction的声明在同一范围内? -
@Grimxn 是的,范围相同。
stringAndType()是csv.swift中的文件私有函数,Transaction是同一文件中的第一个声明。