私は素骨構造を持っています。私のプロジェクトで構造体にスウィフト文字列が格納されていません
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
構造にコピーしたバイト、およびコピーされたデータから初期化された文字列を返すん。私はこれが安全性の問題から私を隔離すると思った...おそらく実現の詳細はString
にありますか?
私はそれがスイッチのケースに入っていると信じて、最後に 'value'と' date'ではなくタイトルが割り当てられていると思います。 – ebby94
なぜあなたは、ケース1を通過するケースが切り替わると思いますか?他のケースを決して実行しないようです。 – JuicyFruit
文字列値の配列を使用してコードを実行しようとすると、すべて正常に動作します。トランザクションの返却:トランザクション(値: "12/22/2015"、日付: "-5.00"、タイトル: "RECURRING PAYMENT BACKBLAZE") – unkgd