无法在 SwiftUI 视图中使用协议

Cannot use Protocols in SwiftUI Views

我目前正在开发一款管理作业的应用程序,因为我使用不同类型的作业,例如待办事项或家庭作业,...。所以我为每个赋值应该有的所有关键变量制定了一个协议,这样我以后可以在一个“所有”列表中显示所有不同的类型(符合赋值)。

在 Playground 中进行测试时,我设法构建了一个视图,该视图采用符合分配的所有类型并显示标题和描述。但是当我开始我的主要项目时,我遇到了这些问题。 项目结构

a class Assignments 包含我所有的数据。目前我有两个列表,其中有两种类型符合作业、家庭作业和在线课程。这只是一个过渡,仍然不是好的做法...

a func getAll 稍后应该 return 这两个列表。

  class Assignments: Storable, Codable, ObservableObject {

      @Published var homeWorks: [HomeWork] 
      @Published var sortDescriptor: SortType
      @Published var onlineLessons: [OnlineLesson] 

     func getAll<A: Assignment>() -> [A] {
         var toReturn: [A] = []
     
         toReturn.append(contentsOf: homeWorks as! [A])
         toReturn.append(contentsOf: onlineLessons as! [A])
         //I also don't understand why I have to cast the arrays as both types already conform to Assignment

        return toReturn
     }
 }

这是 'Assignment' 协议:

protocol Assignment: ObservableObject, Identifiable {
    var title: String {get set}
    var description: String {get set}
    var createdAt: Date {get}
    var dueTo: Date {get}
    var type: AssignmentType {get set}
}

景色

struct AssignmentsAllView: View {
    @EnvironmentObject var assignments: Assignments
    ...
}

@main
struct Homework_PlannerApp: App {
   var assignments: Assignments = Assignments()

   var body: some Scene {
       WindowGroup {
           ContentView()
               .environmentObject(assignments)
       }
   }
}

1st:在列表中

ForEach(assigments.getAll()) {assigment in
    //Unable to infer type of a closure parameter 'assigment' in the current context
    // Generic parameter 'A' could not be inferred             
}

2nd:在没有列表的情况下尝试

 Text(homeWorks.getAll().first!.title) //Generic parameter 'A' could not be inffered

有人知道我做错了什么,或者如何解决这个问题。因为我是协议的新手,老实说,到目前为止我还不喜欢它。

感谢您的帮助, 我通过用 class Assignment:

替换协议 Assignment 让一切正常
class Assignment: ObservableObject {
    @Published var title: String
    @Published var description: String
    @Published var createdAt: Date
    @Published var dueTo: Date
    let type: AssigmentType
    
    init(title: String, description: String, dueTo: Date, type: AssigmentType) {
        self.title = title
        self.description = description
        self.createdAt = Date()
        self.dueTo = dueTo
        self.type = type
    }
}

classes HomeWork 和 OnlineLesson 现在继承自这个超级 class...