簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM