我正在嘗試重構我擁有的一些代碼,并認為我能夠將一些代碼從全域可訪問的列舉移動到應用程式的 ViewModel 中。
但是,當我嘗試從視圖訪問它時,它似乎無法訪問,甚至是自動完成中的一個選項。
我想知道是否有這種情況的原因,以及是否有我遺漏的東西..
// view
struct MyView: View {
@StateObject var vm = MyViewModel()
var body: some View {
ForEach(vm.MyEnum.allCases, id: \.self) { item in
...
}
}
}
// view model
final class MyViewModel: ObservableObject {
enum MyEnum: String, CaseIterable {
case a, b, c
}
}
我似乎能夠訪問視圖模型中的所有其他內容,但是當涉及到列舉時,它們卻不能。我嘗試閱讀列舉以了解原因,但我遇到的大多數事情主要是“操作方法”,但沒有深入了解原因。
uj5u.com熱心網友回復:
您的問題實際上與enums 無關,更多的是關于屬性與型別。當你這樣做時:
final class MyViewModel: ObservableObject {
enum MyEnum: String, CaseIterable {
case a, b, c
}
}
...您正在定義 2 種型別。
MyViewModel,這是一個classMyEnum,這是一個enum
MyEnum你嵌套在里面并不重要MyViewModel——它仍然只是一個型別,而不是一個屬性。
屬性用letor宣告var。例如:
final class MyViewModel: ObservableObject {
let myEnumArray = [MyEnum.a, MyEnum.b, MyEnum.c] /// create an instance property
enum MyEnum: String, CaseIterable {
case a, b, c
}
}
struct MyView: View {
@StateObject var vm = MyViewModel()
var body: some View {
/// access the instance property here!
ForEach(vm.myEnumArray, id: \.self) { item in
/// ...
}
}
}
在上面的代碼中,我創建了一個新屬性 ,myEnumArray您可以使用 訪問它vm.myEnumArray。這將起作用。
現在如果你想訪問MyEnum'sallCases怎么辦?請注意,此屬性是靜態的——該屬性屬于型別本身,而不是該型別的實體。這就是為什么它沒有出現在您的自動完成中。例子:
MyViewModel.MyEnum.allCases /// Works! The type is `MyViewModel.MyEnum` and I'm accessing the static `allCases` property.
@StateObject var vm = MyViewModel()
vm.MyEnum.allCases /// NO! the `MyEnum` property doesn't exist inside `vm`.
所以你的代碼真的有兩個問題。
- 你認為
MyEnum是一種財產。不,是一種型別! - 因為
MyEnum是一種型別,所以您無法訪問它vm.MyEnum(這就是您訪問實體屬性的方式)。你需要做MyViewModel.MyEnum。
這是固定代碼:
struct MyView: View {
var body: some View {
ForEach(MyViewModel.MyEnum.allCases, id: \.self) { item in
/// ...
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/484228.html
上一篇:如何使用JetpackCompose提高性能(在@Composable函式中組裝某些東西時)
下一篇:如何根據選擇excel填充內容?
