【问题标题】:Swift strings are not being stored in structSwift 字符串未存储在结构中
【发布时间】: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.datetransaction.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 日更新

此代码中的逻辑按预期运行。我认为这里的问题是内存管理。为了帮助推动这一点,我已经...

  1. 从我的交换机中删除了 print
  2. 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,而不是 valuedate
  • 你为什么认为,你切换 case 会通过 case 1?看起来它从不执行其他案例。
  • 当我尝试使用带有字符串值的数组运行您的代码时,一切正常:返回事务:事务(值:“12/22/2015”,日期:“-5.00”,标题:“经常性付款后遗症")
  • 你的函数stringAndType的范围是什么?是本地的吗? IE。与transaction的声明在同一范围内?
  • @Grimxn 是的,范围相同。 stringAndType()csv.swift 中的文件私有函数,Transaction 是同一文件中的第一个声明。

标签: swift memory swift3


【解决方案1】:

感谢@unkgd,您在撤回之前的初始答案是正确的。 while parser.isOk 循环和父循环(省略以保持代码简短)之间存在逻辑错误,该循环正在擦除设置的 valuetitle 之间的事务。输出中没有任何迹象表明发生了这种情况。上面发布的循环不是循环三次,而是循环一次,但是那个循环被父级迭代了三次。因此,只有最近解析的值存储在结构中,在本例中为title。再次感谢@unkgd(如果您重新发布您的答案,我会将其标记为正确)。感谢大家的想法。

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2022-11-27
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多