非常に単純なMVCプログラムをラベルとボタンで作成しました。ラベルには、ボタンを押したときにインクリメントされるカウンタの値が表示されます。Swift:クラスを構造体に変更する方法
次のコードは、モデルファイルとビューコントローラファイルを示しています。モデルファイルはクラスです。 そのコードは機能します。ここで
import Foundation
protocol MVCModelDelegate {
var message: String {get set}
}
// when I change class to struct
// delegate is set to nil
// causing the program not to update the label
class Model {
var delegate: MVCModelDelegate?
var counter: Int
var message: String {
didSet {
delegate?.message = model.message
}
}
init(counter: Int, message: String) {
self.counter = counter
self.message = message
}
}
// create instance
var model = Model(counter: 0, message: "")
// counting
func incrementCounter() {
model.counter += 1
model.message = "Counter Value: \(model.counter)"
}
は、ビューコントローラファイルである
import Cocoa
class ViewController: NSViewController, MVCModelDelegate {
// communication link to the model
var model1 = model
var message = model.message {
didSet {
didUpdateModel(message: message)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.model1.delegate = self
}
// update display
func didUpdateModel(message: String) {
Label1.stringValue = model1.message
}
// Label
@IBOutlet weak var Label1: NSTextField! {
didSet {
Label1.stringValue = " counter not started"
}
}
// Button
@IBAction func testButton(_ sender: NSButton) {
incrementCounter()
}
}
問題:私は今の代わりに構造体を使用するモデルファイルのコードを変更したい。ここ
はモデルファイルでありますこの非常に簡単なプログラムとしてのクラスは、クラスのすべての機能を必要としません。しかし、すぐに構造体のクラスを変更します。プログラムはまだ実行されますが、デリゲート変数がnilに設定されていて別の値を取得しないため、ラベルは更新されません。
質問:何が欠けていますか?迅速なドキュメントは、可能であればstructを使用することを奨励しています。そして、私はそのコードで、クラスを構造体に変換する際の問題であるとは見ていません。
クラスを構造体に変更するときに、 'mutating func incrementCounter()'を追加してみてください。私はデフォルトでは、 'value'型のプロパティはそのインスタンスメソッド内から変更できないと思います。 – Simon
@サイモン。これは[func incrementCounter]が構造体のメソッドであった場合に機能します。 –