Arghh, this is always so annoying. What am I doing wrong?
Xcode (12b6, SPM, 5.3) says "Constant 'self.propertyDescriptors' used before being initialized" at the call to buildPropertyDecsriptors()
. But I don't see it being used at all, just the attempt to assign it.
Other annoying things: I can't seem to let it default uninitialized optional properties to nil (I thought Swift used to do that?)
struct
MachineContent : Content
{
let id: UUID
let name: String
let imageURL: String?
let libraries: [LibraryContent]?
let propertyDescriptors: [UUID : PropertyDescriptorContent]?
init(id inID: UUID, name inName: String, imageURL inImageURL: String?, libraries inLibraries: [LibraryContent]? = nil)
{
self.id = inID
self.name = inName
self.imageURL = inImageURL
self.libraries = inLibraries
self.propertyDescriptors = nil
}
init(from inMachine: Machine, loadDescriptors inLoadDescriptors: Bool = true)
{
self.id = inMachine.id!
self.name = inMachine.name
self.imageURL = inMachine.imageURL
if inLoadDescriptors
{
self.libraries = inMachine.toolLibraries.map { LibraryContent(from: $0) }
self.propertyDescriptors = buildPropertyDecsriptors(machine: inMachine) // Error here
}
else
{
self.libraries = nil
self.propertyDescriptors = nil
}
}
func
buildPropertyDecsriptors(machine inMachine: Machine)
-> [UUID : PropertyDescriptorContent]?
{
// Get a unique set of PropertyDescriptors…
var descriptors = Set<PropertyDescriptor>()
inMachine.toolLibraries.forEach
{ (inLibrary) in
inLibrary.tools.forEach
{ (inTool) in
inTool.properties.forEach { descriptors.insert($0.descriptor) }
inTool.tool?.properties.forEach { descriptors.insert($0.descriptor) }
inTool.holder?.properties.forEach { descriptors.insert($0.descriptor) }
inTool.insert?.properties.forEach { descriptors.insert($0.descriptor) }
}
}
var descContent = [UUID : PropertyDescriptorContent]()
descriptors.forEach
{ (inDesc) in
descContent[inDesc.id!] = PropertyDescriptorContent(from: inDesc)
}
return descContent
}
}