0

我的目标是创建一个 SwiftUI 结构,它可以按顺序生成数据的滚动视图,其中数据和 data_view 在 ScrollView 中放在一起。

我从 ForEach 行上的这段代码中得到标题错误。数组的类型似乎无关紧要,我将其设置为“任何”,并得到了同样的错误。

  1. 如果用英语句子说,“(_) -> _”是什么? “带下划线的函数,返回下划线”没有任何意义。
  2. 什么会让这段代码做我想要的?
  3. 这甚至是最好的方法吗?(我正计划对其进行工作以使代码更通用,例如为视图函数创建一个变量,但我想在更进一步之前得到一个工作的东西)
import SwiftUI

protocol DatedOrPrioritizedStruct {
    var id: UUID {get}
    var priority: Float {get set} ///Priority must be set
    var start: Date? {get set} ///Could be nil. Used in conjunction with priority if set.
}

struct TimeLine : View {

    var data: [DatedOrPrioritizedStruct]

    var body: some View {
        GeometryReader { geometry in
           NavigationView {
               VStack {
                   ScrollView {
                        ForEach(self.data, id: \.self)  { item in
                                                      //^-ERROR redline here
                            TaskView(task: item).frame(minWidth: 0, idealWidth: geometry.size.width * 0.80, maxWidth: geometry.size.width, alignment: .leading)
                        }
                    }.frame(minWidth: 0, maxWidth: geometry.size.width, alignment: .leading)
                     .navigationBarTitle("Do The First Thing", displayMode: .large)
                }
            }.navigationBarHidden(true)
            .navigationBarBackButtonHidden(true)
         }
    }
}

任务类:

public class Task: DatedOrPrioritizedStruct, Identifiable, Equatable {
    public static func == (lhs: Task, rhs: Task) -> Bool {
        return lhs.id == rhs.id
    }

    public let id = UUID()

    var title: String
    var creation: Date
    var priority: Float
    var start: Date?
    var deadline: Date?
    var completed: Date?
    var note: String?
    var recur: Double?
    var duration: TimeInterval


    public init (_ title: String) {
        self.title = title
        self.creation = Date()
        self.priority = 3.0
        self.start = nil
        self.deadline = nil
        self.completed = nil
        self.note = nil
        self.recur = nil
        self.duration = 3600.0
    }

    public init (_ title: String, priority: Float) {
        self.title = title
        self.creation = Date()
        self.priority = priority
        self.start = nil
        self.deadline = nil
        self.completed = nil
        self.note = nil
        self.recur = nil
        self.duration = TimeInterval(9 * 24 * 3600 + 3 * 3600 + 20 * 60)
    }
}
4

1 回答 1

0

如果您更换

TaskView(task: item).frame(minWidth: 0, idealWidth: geometry.size.width * 0.80, maxWidth: geometry.size.width, alignment: .leading)

用一个简单的行Text("Testing"),你会看到错误变为

协议类型“DatedOrPrioritizedStruct”不能符合“Hashable”,因为只有具体类型才能符合协议

您可以通过将ForEach' 的标识符指定为来解决此问题\.id

ForEach(self.data, id: \.id)  { item in
    TaskView(task: item).frame(minWidth: 0, idealWidth: geometry.size.width * 0.80, maxWidth: geometry.size.width, alignment: .leading)
}

确保TaskView'stask的类型是DatedOrPrioritizedStruct,而不是Task,因为由于您的data数组包含DataOrPrioritizedStruct对象,所以iteminForEach将是 a DataOrPrioritizedStruct,而不是 a Task

旁注:目前,Xcode 经常给出不相关的错误,就像在这种情况下一样,您可以尝试通过简化代码来找出真正的来源(我通过放入Text("Testing")ForEach注释掉该TaskView行)。

编辑:为了澄清,TaskView期望接收Task类型,但是在ForEach数组上迭代DataOrPrioritizedStruct,所以当你传入时,item不能TaskView保证对象具有唯一的数据成员Task,这就是为什么TaskView'stask的类型必须是DataOrPrioritizedStruct,不是Task

于 2019-10-14T07:39:37.287 回答