I want to preview my file but can’t because of this error: Type of expression is ambiguous without a type annotation. im using Xcode beta 16 and target iOS 18
import SwiftUI
struct WorkoutStartView: View {
@Binding var workout: Workout?
var body: some View {
VStack {
// my code
}
}
#Preview {
let sampleExercises: [Exercise] = [
Exercise(name: "Sit-ups", imageName: "sitUps", difficulty: 3, guidelines: "Test guidelines for crunches.", muscle: "Upper"),
Exercise(name: "Leg raises", imageName: "legRaises", difficulty: 3, guidelines: "Test guidelines for reverse crunches.", muscle: "Lower"),
Exercise(name: "L-sit", imageName: "lSit", difficulty: 3, guidelines: "Test guidelines for flutter kicks.", muscle: "6 Pack"),
Exercise(name: "Side jack-knives", imageName: "sideJackKnives", difficulty: 3, guidelines: "Test guidelines for sitting twists.", muscle: "Obliques"),
Exercise(name: "Dead bug", imageName: "deadBug", difficulty: 3, guidelines: "Test guidelines for knee to elbow.", muscle: "Complete"),
Exercise(name: "Wipers", imageName: "wipers", difficulty: 3, guidelines: "Test guidelines for half wipers.", muscle: "Core"),
Exercise(name: "Long arm cruches", imageName: "longArmCrunches", difficulty: 4, guidelines: "Test guidelines for crunches.", muscle: "Upper"),
Exercise(name: "Pulse ups", imageName: "pulseUps", difficulty: 4, guidelines: "Test guidelines for reverse crunches.", muscle: "Lower"),
Exercise(name: "Star plank", imageName: "starPlank", difficulty: 4, guidelines: "Test guidelines for flutter kicks.", muscle: "6 Pack")
]
@State var sampleWorkout: Workout? = Workout(
name: "Morning Routine",
difficulty: 3,
workingTime: 30,
recoveryTime: 30,
isSet: false,
duration: 8
)
sampleWorkout!.exercises = sampleExercises
WorkoutStartView(workout: $sampleWorkout).preferredColorScheme(.dark)
}
sorry for the bigs code blocks but wanted my error to be reproducible.
here are the two classes implied implementation:
@Model
class Workout: Identifiable {
var id: UUID
var name: String
var difficulty: Int
var workingTime: Int
var recoveryTime: Int
var count: Int
var duration: Int
var isSet: Bool
var setNumber: Int?
var restTime: Int?
// Define a one-to-many relationship with Exercise
@Relationship(deleteRule: .cascade, inverse: Exercise.workout) var exercises: [Exercise]? = [Exercise]()
init(name: String, difficulty: Int, workingTime: Int, recoveryTime: Int, isSet: Bool, duration: Int, setNumber: Int? = nil, restTime: Int? = nil) {
self.id = UUID()
self.name = name
self.difficulty = difficulty
self.count = 0
self.duration = duration
self.workingTime = workingTime
self.recoveryTime = recoveryTime
self.isSet = isSet
self.setNumber = setNumber
self.restTime = restTime
}
func difficultySymbol() -> Image {
switch difficulty {
case 1:
return Image(systemName: "circle.fill")
case 2:
return Image(systemName: "triangle.fill")
case 3:
return Image(systemName: "square.fill")
case 4:
return Image(systemName: "hexagon.fill")
case 5:
return Image(systemName: "star.fill")
default:
return Image(systemName: "flame.fill")
}
}
func ToString() -> String {
var res = "(name) - (difficultySymbol()) - (workingTime)n"
for exercise in exercises! {
res += "t(exercise.name)n"
}
return res
}
}
@Model
class Exercise: Identifiable, Equatable {
var id: UUID
var name: String
var imageName: String
var difficulty: Int
var guidelines: String
var muscle: String
// Define the relationship back to Workout
var workout: Workout?
init(name: String, imageName: String, difficulty: Int, guidelines: String, muscle: String, workout: Workout? = nil) {
self.id = UUID()
self.name = name
self.imageName = imageName
self.difficulty = difficulty
self.guidelines = guidelines
self.muscle = muscle
self.workout = workout
}
static func == (lhs: Exercise, rhs: Exercise) -> Bool {
return lhs.name == rhs.name
}
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
var image: Image {
Image(imageName)
}
var muscleImg: Image {
Image(muscle)
}
func difficultySymbol() -> Image {
switch difficulty {
case 1:
return Image(systemName: "circle.fill")
case 2:
return Image(systemName: "triangle.fill")
case 3:
return Image(systemName: "square.fill")
case 4:
return Image(systemName: "hexagon.fill")
case 5:
return Image(systemName: "star.fill")
default:
return Image(systemName: "flame.fill")
}
}
func toString() -> String {
return "(name) - (muscle) - (difficulty)"
}
}
Of course, I tried to type annotate all my variable but nothing fixed.
I waited too much code so I have to write more to post this code. ignore this please.
Leandro is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.