无法推断复杂的闭包返回类型;添加显式类型以消除Swift UI的歧义

时间:2020-07-31 20:10:26

标签: swift swiftui

当我将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)
            }
            
        }
        
        
    }
}

1 个答案:

答案 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