Swift字符串未存储在struct

时间:2017-02-15 07:15:10

标签: swift memory swift3

我有一个简单的骨骼结构。

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字符串是结构,因此在写入时复制,就像整数或双精度一样。希望你能提供见解。谢谢你的时间。

更新02/15/17

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

  1. 从我的开关中删除了print
  2. didSet {}
  3. 中的每个变量添加了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的实施细节我错过了?

1 个答案:

答案 0 :(得分:0)

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