gpt4 book ai didi

ios - 如何开始使用协议(protocol)?

转载 作者:行者123 更新时间:2023-12-01 21:54:39 27 4
gpt4 key购买 nike

使用 get set 时我很困惑在协议(protocol)中。仅使用 get工作正常,但 set部分没有'。

protocol MainViewModelProtocol {
var localDoor: LocalDoorCoreDataObject { get set }
}

extension MainViewModelProtocol {
var localDoor: LocalDoorCoreDataObject {
get { return MainViewModel.instance.localDoor }
set { localDoor = newValue }
}
}

final class MainViewModel: MainViewModelProtocol {
var localDoor: LocalDoorCoreDataObject = LocalDoorCoreDataObject()
...

然后当我在 viewController 中使用它时
self.mainViewModel.localDoor = $0

但这给了我错误

Cannot assign to property: 'mainViewModel' is a get-only property



如何正确设置?

编辑

发起 viewModelfactory based dependency injection 完成
protocol MainViewModelInjected {
var mainViewModel: MainViewModelProtocol { get }
}

extension MainViewModelInjected {
var mainViewModel: MainViewModelProtocol { return MainViewModel.instance }
}

最佳答案

这完全取决于您如何为 mainViewModel 创建对象.
让我们用您的代码创建一些案例:

import UIKit
typealias LocalDoorCoreDataObject = String

protocol MainViewModelProtocol {
var localDoor: LocalDoorCoreDataObject { get set }
}

extension MainViewModelProtocol {
var localDoor: LocalDoorCoreDataObject {
get { return MainViewModel.instance.localDoor }
set { localDoor = newValue }
}
}

final class MainViewModel: MainViewModelProtocol {
static let instance = MainViewModel()
var localDoor: LocalDoorCoreDataObject = LocalDoorCoreDataObject()
}

protocol MainViewModelInjected {
var mainViewModel: MainViewModelProtocol { get }
}

extension MainViewModelInjected {
var mainViewModel: MainViewModelProtocol { return MainViewModel.instance }
}
情况1
在这里,我们创建一个对象并通过 getter 作为闭包分配对象。
所以,这里 mainViewModel只有 getter 而不是 setter,即它是一个 get-only 属性。
var mainViewModel: MainViewModelProtocol { MainViewModel.instance }
mainViewModel.localDoor = "assign some thing" // Error: Cannot assign to property: 'mainViewModel' is a get-only property
案例2
这里我们直接将对象分配给 mainViewModelOther .因此,这将是一个正常属性,您可以更改模型的属性。
var mainViewModelOther: MainViewModelProtocol = MainViewModel.instance
mainViewModelOther.localDoor = "assign some thing"
案例3
您也可以创建 class它将保存您的模型对象,并创建您的类的另一个对象。您可以更改模型的属性。
class MyClass {
var mainViewModel: MainViewModelProtocol = MainViewModel.instance
}

let myClassObj = MyClass()
myClassObj.mainViewModel.localDoor = "assign some thing"

关于ios - 如何开始使用协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61359177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com