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