SwiftUI: невозможно преобразовать значение типа '(Задача) -> некоторый вид' в ожидаемый тип аргумента '(_) -> _' - PullRequest
0 голосов
/ 14 октября 2019

Моя цель здесь состоит в том, чтобы создать структуру 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)
    }
}

1 Ответ

0 голосов
/ 14 октября 2019

Если вы замените строку

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 task имеет тип DatedOrPrioritizedStruct, а не Task, поскольку, поскольку ваш массив data содержит DataOrPrioritizedStruct объектов, item в ForEach будет DataOrPrioritizedStruct, а неa Task.

Примечание : В настоящее время Xcode часто выдает не относящиеся к делу ошибки, как в этом случае, и вы можете попытаться выяснить истинный источник, упростив свой код (который ясделал, поместив Text("Testing") в ForEach и закомментировав строку TaskView).

Редактировать : Чтобы уточнить, TaskView ожидает получить тип Task, ноForEach перебирает массив DataOrPrioritizedStruct, поэтому, когда вы передаете item в TaskView, нет никакой гарантии, что объект имеет данные members, уникальные для Task, поэтому тип TaskView task должен быть DataOrPrioritizedStruct, а не Task.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...