Swift Struct vs Class: what is the allowed stack size? and refactoring a class to a struct
While the struct itself lives on the stack, the array data lives on the heap so that array can grow in size dynamically. So even if you have an array with million items in it and pass it somewhere, none of the items are copied until you change the new array due to the copy-on-write implementation. This is described in details in 2015 WWDC Session 414.
As for the second question, I think that 2015 WWDC Session 414 again has the answer. The basic check that Apple engineers recommend for value types are:
Use a value type when:
- Comparing instance data with == makes sense
- You want copies to have independent state
- The data will be used in code across multiple threads
Use a reference type (e.g. use a class) when:
- Comparing instance identity with === makes sense
- You want to create shared, mutable state
So from what you've described, I think that reference types fit Processor
and Analyzer
much better. It doesn't seem that copies of Processor
and Analyzer
are valid objects if you've not created new Producer
s and Analyzer
s explicitly. Would you not want the changes to these objects to be shared?