Swift泛型枚举值问题:父ViewModel泛型定义报错求助
SwiftUI 泛型父ViewModel实现方案
你遇到的「Cannot find type 'T' in scope」错误,是因为ParentViewModel没有声明泛型参数,内部枚举Status里的T找不到对应的类型定义。要实现支持自定义类型的泛型父ViewModel,需要把泛型参数绑定到父类本身,具体修改如下:
修正后的父ViewModel实现
把ParentViewModel声明为泛型类,将<T>作为类的泛型参数,这样内部的Status枚举就能直接使用这个T类型:
class ParentViewModel<T>: ObservableObject { enum Status { case loading case loaded(T) case error(Error) } @Published var status: Status = .loading }
自定义子ViewModel的正确写法
子类继承时需要指定具体的泛型类型(比如你的SomeObject),这样status的loaded case就能接收对应类型的对象:
// 先定义示例用的SomeObject struct SomeObject { let id: Int let name: String } class ChildViewModel: ParentViewModel<SomeObject> { // 空初始化,默认状态为loading init() { super.init() } // 传入SomeObject的初始化方法 init(object: SomeObject) { super.init() self.status = .loaded(object) } }
额外说明
- 如果需要支持可选类型或者更灵活的约束,可以给泛型T添加限制,比如
ParentViewModel<T: Codable>: ObservableObject,让子类只能传入符合Codable协议的类型。 - 父类的
@Published var status会自动把状态变化传递给SwiftUI视图,子类直接使用即可,无需额外处理状态发布逻辑。
内容的提问来源于stack exchange,提问作者Noah Iarrobino
相关产品推荐
相关产品推荐

