如何更改对已在 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)
输出:
- --
- 厘米
- 厘米
- 英寸
在 viewModel 和 settingsModel 之间再放一层。就像一个 settingsService,其中每个 viewModel 都会引用相同的服务,当你想更改设置模型时,你可以在 settingsService 中进行,它为 viewModel 提供设置模型。
settingsService.settingsModel = globalSettingsModel
class ViewModel {
var settingsService: SettingsServiceProtocol?
var unit: String {
settingsService?.settingsModel.unit ?? "--"
}
}
我想要一个全局设置模型并在运行时更改它。不幸的是,我的视图模型保留了旧全局设置模型的参考。我的复杂解决方案是使用新的设置模型再次更新所有视图模型。有更好的解决方案吗?这是我的示例代码,它不起作用。我的意图是第三个输出是“英寸”。
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)
输出:
- --
- 厘米
- 厘米
- 英寸
在 viewModel 和 settingsModel 之间再放一层。就像一个 settingsService,其中每个 viewModel 都会引用相同的服务,当你想更改设置模型时,你可以在 settingsService 中进行,它为 viewModel 提供设置模型。
settingsService.settingsModel = globalSettingsModel
class ViewModel {
var settingsService: SettingsServiceProtocol?
var unit: String {
settingsService?.settingsModel.unit ?? "--"
}
}