[英]How do I change the variable "url" which is inside of a class by using a struct? in swift
[英]Swift: how to change a class into a struct
我編寫了一個帶有標簽和按鈕的非常簡單的MVC程序。 標簽顯示計數器的值,該值在按下按鈕時增加。
后面的代碼提供了模型文件和視圖控制器文件。 模型文件是一個類。 該代碼有效。
這是模型文件:
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()
}
}
問題:我現在想更改模型文件的代碼,以使用結構代替類,因為這個非常簡單的程序不需要類的所有功能。 但是,一旦我為struct更改類。 該程序仍在運行,但是由於委托變量設置為nil並且從未獲得其他值,因此標簽未更新。
問題:我想念什么? 迅速的文檔鼓勵盡可能使用struct。 而且我沒有在該代碼中看到將類轉換為結構可能存在的問題。
結構是不可變的,不會像類一樣通過引用傳遞,而是通過值傳遞。 這意味着當你做
var model1 = model
您正在創建model
的副本。
修改model1
不會將更改傳播到model
,因此您在incrementCounter
model1
所做的所有操作都不會反映在視圖控制器中。
如果您希望incrementCounter
計數器影響viewController,則必須在viewController實例中使用該模型。
如果您打算共享model
屬性並在更新此模型時更改標簽值,則struct不是最佳選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.