This is not a question, but rather the solution and an explanation of a missing step in the iOS App Dev Tutorial. I hope this helps somebody else encountering the same issue and ultimately leads to a change to the tutorial.
There is a step missing from the iOS App Dev Tutorial under the Passing Data with Bindings part in Section 3 before Step 6. Namely, the update
function has not been defined on the DailyScrum
struct. This results in the following errors in DetailView.swift
when calling scrum.update(from: data)
:
Argument passed to call that takes no arguments Cannot use mutating member on immutable value: 'self' is immutable Referencing instance method 'update()' requires wrapper 'Binding<DailyScrum>'
The files for the complete project at the end of the Passing Data with Bindings part provides the solution: you must add an update function to the DailyScrum model.
Add the following inside the extension DailyScrum
code block:
mutating func update(from data: Data) { title = data.title attendees = data.attendees lengthInMinutes = Int(data.lengthInMinutes) theme = data.theme }
When complete, your DailyScrum.swift file should appear as follows at this stage in the tutorial.
import Foundation struct DailyScrum: Identifiable { let id: UUID var title: String var attendees: [Attendee] var lengthInMinutes: Int var theme: Theme init(id: UUID = UUID(), title: String, attendees: [String], lengthInMinutes: Int, theme: Theme) { self.id = id self.title = title self.attendees = attendees.map { Attendee(name: $0) } self.lengthInMinutes = lengthInMinutes self.theme = theme } } extension DailyScrum { struct Attendee: Identifiable { let id: UUID var name: String init (id: UUID = UUID(), name: String) { self.id = id self.name = name } } struct Data { var title: String = "" var attendees: [Attendee] = [] var lengthInMinutes: Double = 5 var theme: Theme = .seafoam } var data: Data { Data(title: title, attendees: attendees, lengthInMinutes: Double(lengthInMinutes), theme: theme) } mutating func update(from data: Data) { title = data.title attendees = data.attendees lengthInMinutes = Int(data.lengthInMinutes) theme = data.theme } } extension DailyScrum { static let sampleData: [DailyScrum] = [ DailyScrum(title: "Design", attendees: ["Cathy", "Daisy", "Simon", "Jonathan"], lengthInMinutes: 10, theme: .yellow), DailyScrum(title: "App Dev", attendees: ["Katie", "Gray", "Euna", "Luis", "Darla"], lengthInMinutes: 5, theme: .orange), DailyScrum(title: "Web Dev", attendees: ["Chella", "Chris", "Christina", "Eden", "Karla", "Lindsey", "Aga", "Chad", "Jenn", "Sarah"], lengthInMinutes: 5, theme: .poppy) ] }