我有一个简单的骨骼结构。
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字符串是结构,因此在写入时复制,就像整数或双精度一样。希望你能提供见解。谢谢你的时间。
更新02/15/17
此代码中的逻辑按预期运行。我认为这里的问题是内存管理。为了帮助推动这一点,我......
print
行didSet {}
Transaction
醇>
像这样...
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
结构,并返回从COPIED数据初始化的字符串。我认为这会使我免受安全问题的影响...也许是String
的实施细节我错过了?
答案 0 :(得分:0)
归功于@unkgd,在你收回它之前,你的初始答案是正确的。在设置while parser.isOk
和value
之间擦除事务时,title
循环和父循环(省略以保持代码简短)之间存在逻辑错误。输出中没有迹象表明这种情况发生了。上面发布的循环没有循环三次,而是循环一次,但是父循环迭代了三次。因此,只有最新的解析值存储在结构中,在本例中为title
。再次,完全归功于@unkgd(如果您重新发布您的答案,我会将其标记为正确)。感谢大家的想法。