当我将foreach循环保留在视图中时,我收到一个错误,指出视图“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。当我将foreach循环从视图中移出时,它工作正常。当我实现对一个对象的循环之前,我一直循环直到直到某个数字将“虚拟字符串”传递到ExerciseTableRow视图中时,我才开始出现此错误。不知道如何解决这个问题。预先谢谢你!
struct PassedExerciseCard: View {
var exercise : String
var sets : [ExerciseSet]
var body: some View {
VStack{
Text(exercise).font(.title).padding(.bottom, 5)
Group{
HStack{
Group{
Text("Set")
Text("Weight")
Text("Reps")
}.padding(.horizontal, 30)
.offset(x: -15, y: -5)
}
VStack{
ForEach(sets, id: \.self){ (set : ExerciseSet) in
ExerciseTableRow(set: set.set, readOnly: true, setWeight: set.weight, setReps: set.reps)
}
}.padding(.bottom, 5)
}.offset(x: 20, y: 0)
}
.padding()
.background(Color.offWhite)
.cornerRadius(20)
.shadow(color: Color.black.opacity(0.2), radius: 10, x:10, y:10)
.shadow(color: Color.white.opacity(0.7), radius: 10, x:-5, y:-5)
.padding(.vertical)
}
}
struct PassedExerciseCard_Previews: PreviewProvider {
static var exercise :[ExerciseSet] = []
static var previews: some View {
PassedExerciseCard(exercise: "Bench", sets: exercise)
}
}
更新
我了解到我所犯的错误根本不是错误。实际的错误是编译器认为我没有ExerciseSet的属性,它是NSManagedObject。我更新了对象,使它有了一个主意,并更新了foreach循环,以将每个元素的特定ID用作标识符,但仍然没有运气。
更新代码:
struct PassedExerciseCard: View {
var exercise : String
var sets : [ExerciseSet]
var body: some View {
VStack{
Text(exercise).font(.title).padding(.bottom, 5)
Group{
HStack{
Group{
Text("Set")
Text("Weight")
Text("Reps")
}.padding(.horizontal, 30)
.offset(x: -15, y: -5)
}
VStack{
ForEach(sets, id: \.exerciseSetId){ set in
ExerciseTableRow(set: set.set, readOnly: true, setWeight: set.weight, setReps: set.reps)
}
}.padding(.bottom, 5)
}.offset(x: 20, y: 0)
}
.padding()
.background(Color.offWhite)
.cornerRadius(20)
.shadow(color: Color.black.opacity(0.2), radius: 10, x:10, y:10)
.shadow(color: Color.white.opacity(0.7), radius: 10, x:-5, y:-5)
.padding(.vertical)
}
}
NSManagedObject实体:
import Foundation
import CoreData
extension ExerciseSet {
@nonobjc public class func fetchRequest() -> NSFetchRequest<ExerciseSet> {
return NSFetchRequest<ExerciseSet>(entityName: "ExerciseSet")
}
@NSManaged public var reps: Int16
@NSManaged public var set: Int16
@NSManaged public var weight: Int16
@NSManaged public var exerciseSetId: UUID?
@NSManaged public var origin: Exercise?
}
另外,运动套装与锻炼具有一对一的关系,
extension Workout {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Workout> {
return NSFetchRequest<Workout>(entityName: "Workout")
}
@NSManaged public var date: String?
@NSManaged public var muscle: String?
@NSManaged public var workoutId: UUID?
@NSManaged public var exercise: NSSet?
public var wrappedDate: String{
date ?? "Unknown Date"
}
public var wrappedMuscle: String {
muscle ?? "Unknown Muscle"
}
public var exerciseArray: [Exercise] {
let set = exercise as? Set<Exercise> ?? []
return set.sorted{
$0.wrappedName < $1.wrappedName
}
}
}
// MARK: Generated accessors for exercise
extension Workout {
@objc(addExerciseObject:)
@NSManaged public func addToExercise(_ value: Exercise)
@objc(removeExerciseObject:)
@NSManaged public func removeFromExercise(_ value: Exercise)
@objc(addExercise:)
@NSManaged public func addToExercise(_ values: NSSet)
@objc(removeExercise:)
@NSManaged public func removeFromExercise(_ values: NSSet)
}
在调用PassedExerciseCard的视图中(引发错误的地方),我将WorkoutEntity上的属性:“ exerciseArray”传递给了我在foreach循环中使用的sets属性。我相信这是发生错误的地方
锻炼表行:
struct ExerciseTableRow: View {
@State public var weight : String = "0"
@State public var reps : String = "0"
var set : Int
var readOnly : Bool
var setWeight : Int
var setReps : Int
var body: some View {
HStack{
Text(String(set))
.padding(.trailing, 40)
.padding(.leading, 10)
if readOnly == false{
Group{
TextField("0", text: $weight)
TextField("0", text: $reps)
}.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 50)
.multilineTextAlignment(.center)
.keyboardType(.numberPad)
.padding(.horizontal, 30)
}
else{
Group{
Text(String(setWeight))
Text(String(setReps))
}
.frame(width: 50)
.overlay(
RoundedRectangle(cornerRadius: 5)
.stroke(Color.black, lineWidth: 1)
)
.padding(.bottom, 5)
.padding(.horizontal, 30)
}
}
}
}
答案 0 :(得分:1)
发生错误是因为数据类型之间不匹配:
extension ExerciseSet {
...
@NSManaged public var reps: Int16
@NSManaged public var set: Int16
@NSManaged public var weight: Int16
...
}
但是在ExerciseTableRow
中,它们的类型为Int
:
var set : Int
var setWeight : Int
var setReps : Int
将它们更改为Int16
,它将起作用:
var set : Int16
var setWeight : Int16
var setReps : Int16