【问题标题】:Generalizing multiple view models泛化多个视图模型
【发布时间】:2022-01-03 11:31:15
【问题描述】:

我为我的 SwiftUI 项目编写了几个视图模型。事实证明,它们共享相当多的属性和代码,我想将这些代码提取到通用视图模型中,然后通过用户类继承来专门化真实的视图模型。不幸的是,这变得相当困难。这是一个简化的示例:

class viewModelA: ObservableObject {
    enum Animal {
        case cat
        case dog
    }

    @published var selected: Animal?

    func select(_ animal: Animal?) {
        self.selected = animal
    }
    ...
}

class viewModelB: ObservableObject {
    enum Animal {
        case lion
        case tiger
    }

    @published var selected: Animal?

    func select(_ animal: Animal?) {
        self.selected = animal
    }
    ...
}

我尝试的第一件事是创建一个协议并为 Animal 使用具有关联类型的协议,但后来我遇到了 @published 的属性。 Swift 不允许在协议中包含属性包装器...

我如何概括这两个类?

【问题讨论】:

    标签: swift swiftui combine


    【解决方案1】:

    这是第一种可能的方法(基于协议):

    protocol AnimalModel: ObservableObject {
        associatedtype Animal
        var selected: Animal? { get set }
    }
    
    class ViewModelA: AnimalModel {
        enum Animal {
            case cat
            case dog
        }
    
        @Published var selected: ViewModelA.Animal?
    }
    
    class ViewModelB: AnimalModel {
        enum Animal {
            case lion
            case tiger
        }
    
        @Published var selected: ViewModelB.Animal?
    }
    

    这是第二个(基于继承):

    class ViewModel<Animal>: ObservableObject {
        @Published var selected: Animal?
    }
    
    class ViewModelA: ViewModel<ViewModelA.Animal> {
        enum Animal {
            case cat
            case dog
        }
    }
    
    class ViewModelB: ViewModel<ViewModelB.Animal> {
        enum Animal {
            case lion
            case tiger
        }
    }
    

    【讨论】:

    • 感谢您的帮助。但问题是我也有访问 selected 的函数,这些函数应该被概括。我忘了提这个。
    • 太棒了,我没有考虑类中的泛型类型!所以我使用了第二种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2018-09-12
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多