2017-02-15 7 views
1

私は素骨構造を持っています。私のプロジェクトで構造体にスウィフト文字列が格納されていません

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 {}を削除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にありますか?

+0

私はそれがスイッチのケースに入っていると信じて、最後に 'value'と' date'ではなくタイトルが割り当てられていると思います。 – ebby94

+0

なぜあなたは、ケース1を通過するケースが切り替わると思いますか?他のケースを決して実行しないようです。 – JuicyFruit

+0

文字列値の配列を使用してコードを実行しようとすると、すべて正常に動作します。トランザクションの返却:トランザクション(値: "12/22/2015"、日付: "-5.00"、タイトル: "RECURRING PAYMENT BACKBLAZE") – unkgd

答えて

0

@unkgdの称号をいただきました。あなたは最初の答えを正しい位置に収めていました。​​ループと、valuetitleの間でトランザクションをワイピングしていた親ループ(コードを省略するために省略)に論理エラーがありました。この出来事が出力に現れていることは示されていませんでした。上記のループは3回繰り返されていませんでしたが、1回ループしていましたが、その1回のループは親によって3回反復されました。したがって、最も最近の解析された値のみが構造体に格納されます(この場合はtitle)。繰り返しますが、@unkgdへのフルクレジット(あなたの回答を再投稿し、それを正しいものとしてマークします)。みんなに感謝してくれた

関連する問題