Bird
Raised Fist0
Swiftprogramming~10 mins

Reference sharing and side effects in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Reference sharing and side effects
Create Object A
↓
Assign Reference B = A
↓
Modify Object via B
↓
Check Object A's state
↓
Observe Side Effects
↓
End
This flow shows how two variables can point to the same object, so changing it through one affects the other.
Execution Sample
Swift
class Box {
    var value: Int
    init(value: Int) { self.value = value }
}

let boxA = Box(value: 10)
let boxB = boxA
boxB.value = 20
print(boxA.value)
This code creates a Box object, assigns it to two variables, changes the value via one, and prints the value via the other.
Execution Table
StepActionboxA.valueboxB.valueExplanation
1Create boxA with value 1010-boxA points to Box(value:10)
2Assign boxB = boxA1010boxB points to same Box as boxA
3Change boxB.value = 202020Both see updated value because same object
4Print boxA.value2020Output is 20, showing side effect
5End2020Execution stops
💡 Execution stops after printing boxA.value which is 20 due to shared reference
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
boxA.value-10102020
boxB.value--102020
Key Moments - 2 Insights
Why does changing boxB.value also change boxA.value?
Because boxB and boxA both point to the same Box object, changing the value through one reference affects the shared object, as shown in execution_table step 3.
Is boxB a copy of boxA or a reference to the same object?
boxB is a reference to the same object as boxA, not a copy. This is why changes via boxB affect boxA's value (see execution_table step 2).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is boxA.value after step 3?
A20
B10
C0
DUndefined
💡 Hint
Check the 'boxA.value' column at step 3 in the execution_table.
At which step do boxA and boxB start pointing to the same object?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Look at the 'Action' column in execution_table where boxB is assigned.
If we changed boxB.value to 30 instead of 20 at step 3, what would boxA.value be after step 3?
A20
B30
C10
DUndefined
💡 Hint
Since boxA and boxB share the same object, changing boxB.value changes boxA.value too (see variable_tracker).
Concept Snapshot
Reference sharing means two variables point to the same object.
Changing the object via one variable affects the other.
In Swift, classes are reference types.
Use this to understand side effects.
Example: let b = a; b.value = x changes a.value too.
Full Transcript
This example shows how in Swift, when you assign one class instance to another variable, both variables refer to the same object in memory. Changing the object's property through one variable changes it for the other as well. The execution table traces creating a Box object with value 10, assigning it to boxB, changing boxB's value to 20, and printing boxA's value which is also 20. This demonstrates reference sharing and side effects clearly.

Practice

(1/5)
1. In Swift, what happens when you assign one class instance to another variable?
easy
A. The compiler throws an error because classes cannot be assigned.
B. A new copy of the object is created; changes do not affect each other.
C. Both variables refer to the same object; changes affect both.
D. The original object is deleted and replaced by the new variable.

Solution

  1. Step 1: Understand class assignment behavior

    In Swift, classes are reference types, so assigning one instance to another variable makes both variables point to the same object.
  2. Step 2: Effect of modifying through one variable

    Changing the object through one variable affects the object seen by the other variable because they share the same reference.
  3. Final Answer:

    Both variables refer to the same object; changes affect both. -> Option C
  4. Quick Check:

    Class assignment shares references = D [OK]
Hint: Classes share references; variables point to the same object [OK]
Common Mistakes:
  • Thinking classes copy data on assignment
  • Confusing classes with structs
  • Assuming changes affect only one variable
2. Which of the following is the correct way to declare a class instance and assign it to another variable in Swift?
easy
A. let obj1 = MyClass(); let obj2 = obj1
B. var obj1 = MyClass() var obj2 = obj1
C. let obj1 = MyClass() let obj2: MyClass = obj1()
D. var obj1 = MyClass() let obj2 = new MyClass()

Solution

  1. Step 1: Check correct syntax for class instance creation

    In Swift, you create a class instance with MyClass() and assign it to a variable using let or var with an equals sign.
  2. Step 2: Verify assignment to another variable

    Assigning obj1 to obj2 is done simply by let obj2 = obj1; no parentheses or 'new' keyword are used.
  3. Final Answer:

    let obj1 = MyClass(); let obj2 = obj1 -> Option A
  4. Quick Check:

    Correct class instance assignment syntax = A [OK]
Hint: Use let/var with equals and no 'new' keyword in Swift [OK]
Common Mistakes:
  • Using 'new' keyword like other languages
  • Adding parentheses after variable names
  • Missing semicolons but Swift allows them optionally
3. Consider this Swift code:
class Box {
  var value: Int
  init(value: Int) { self.value = value }
}

let box1 = Box(value: 10)
let box2 = box1
box2.value = 20
print(box1.value)

What is the output?
medium
A. 20
B. 10
C. Compilation error
D. Runtime error

Solution

  1. Step 1: Understand reference sharing in class instances

    box1 and box2 both refer to the same Box object because classes are reference types.
  2. Step 2: Effect of changing box2.value

    Changing box2.value to 20 changes the single shared object, so box1.value also reflects 20.
  3. Final Answer:

    20 -> Option A
  4. Quick Check:

    Class reference sharing means box1.value = 20 [OK]
Hint: Changing one reference changes all pointing to same object [OK]
Common Mistakes:
  • Assuming box1.value stays 10 after box2 changes it
  • Confusing class with struct behavior
  • Expecting a compile or runtime error
4. What is wrong with this Swift code snippet?
class Person {
  var name: String
  init(name: String) { self.name = name }
}

var p1 = Person(name: "Alice")
var p2 = p1
p2.name = "Bob"
print(p1.name)
medium
A. p2 should be declared with let, not var.
B. Nothing is wrong; output is "Bob".
C. Changing p2.name does not affect p1.name.
D. Class Person must be a struct to allow copying.

Solution

  1. Step 1: Analyze reference sharing in the code

    p1 and p2 both point to the same Person instance because Person is a class.
  2. Step 2: Effect of changing p2.name

    Changing p2.name to "Bob" changes the shared object, so p1.name also becomes "Bob".
  3. Final Answer:

    Nothing is wrong; output is "Bob". -> Option B
  4. Quick Check:

    Class reference sharing means p1.name = "Bob" [OK]
Hint: Class instances share references; changes reflect everywhere [OK]
Common Mistakes:
  • Expecting p1.name to remain "Alice"
  • Thinking var vs let affects reference sharing
  • Believing class must be struct for copying
5. You want to create a copy of a class instance in Swift so that modifying the copy does not affect the original. Which approach correctly achieves this?
hard
A. Declare the class as a struct instead of a class.
B. Assign the instance to a new variable; this automatically copies it.
C. Use the 'clone' keyword to duplicate the instance.
D. Make the class conform to NSCopying and implement copy(with:), then use copy().

Solution

  1. Step 1: Understand copying behavior of classes

    Classes in Swift do not copy on assignment; variables share references by default.
  2. Step 2: Use NSCopying protocol for explicit copying

    To create a true copy, the class must conform to NSCopying and implement copy(with:) method, then call copy() to get a new instance.
  3. Step 3: Evaluate other options

    Assigning to a new variable shares the reference. Declaring as a struct changes the type but is not always possible. The 'clone' keyword does not exist in Swift.
  4. Final Answer:

    Make the class conform to NSCopying and implement copy(with:), then use copy(). -> Option D
  5. Quick Check:

    Explicit copy via NSCopying = C [OK]
Hint: Use NSCopying protocol to make class copies [OK]
Common Mistakes:
  • Assuming assignment copies the object
  • Confusing structs with classes for copying
  • Expecting a 'clone' keyword in Swift
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard