如何更改对已在 swift 中实现相同协议的新对象的对象引用?

How can I change an object reference to a new object that has implemented the same protocol in swift?

我想要一个全局设置模型并在运行时更改它。不幸的是,我的视图模型保留了旧全局设置模型的参考。我的复杂解决方案是使用新的设置模型再次更新所有视图模型。有更好的解决方案吗?这是我的示例代码,它不起作用。我的意图是第三个输出是“英寸”。

protocol SettingsModelProtocol {
    var unit: String { get set }
}

class MetricSettingsModel: SettingsModelProtocol {
    var unit: String = "cm"
}

class ImperialSettingsModel: SettingsModelProtocol {
    var unit: String = "Inch"
}

class ViewModel {
    var settingsModel: SettingsModelProtocol?
    var unit: String {
        settingsModel?.unit ?? "--"
    }
}

var globalSettingsModel: SettingsModelProtocol = MetricSettingsModel()

var viewModel = ViewModel()
print(viewModel.unit)
viewModel.settingsModel = globalSettingsModel
print(viewModel.unit)
globalSettingsModel = ImperialSettingsModel()
print(viewModel.unit)
viewModel.settingsModel = globalSettingsModel
print(viewModel.unit)

输出:

  1. --
  2. 厘米
  3. 厘米
  4. 英寸

在 viewModel 和 settingsModel 之间再放一层。就像一个 settingsService,其中每个 viewModel 都会引用相同的服务,当你想更改设置模型时,你可以在 settingsService 中进行,它为 viewModel 提供设置模型。

settingsService.settingsModel = globalSettingsModel

class ViewModel {
    var settingsService: SettingsServiceProtocol?
    var unit: String {
        settingsService?.settingsModel.unit ?? "--"
    }
}