Reference sharing means multiple variables point to the same instance of a class. Changing the instance through one variable affects all others pointing to it.
Click to reveal answer
beginner
What is a side effect in programming?
A side effect happens when a function or operation changes something outside its own scope, like modifying a shared object or variable.
Click to reveal answer
intermediate
How do struct and class differ in Swift regarding reference sharing?
Structs are value types, so each variable has its own copy. Classes are reference types, so variables share the same instance and changes affect all references.
Click to reveal answer
beginner
What happens when you modify a class instance through one reference in Swift?
All references to that instance see the change because they point to the same object in memory.
Click to reveal answer
intermediate
Why can reference sharing cause bugs in Swift programs?
Because changes through one reference affect others unexpectedly, leading to unintended side effects and harder-to-find bugs.
Click to reveal answer
In Swift, which type shares references by default?
AEnum
BClass
CStruct
DTuple
✗ Incorrect
Classes are reference types, so variables share the same instance. Structs, enums, and tuples are value types and do not share references.
What is a side effect?
AChanging something outside the function's scope
BA function returning a value
CDeclaring a variable
DCalling a function
✗ Incorrect
A side effect means modifying something outside the function, like changing a shared object or global variable.
If two variables reference the same class instance and you change a property via one variable, what happens?
ABoth variables see the change
BOnly that variable sees the change
CThe change is ignored
DA new instance is created
✗ Incorrect
Because both variables point to the same instance, changes through one are visible through the other.
Which Swift type avoids side effects by copying data on assignment?
AClass
BClosure
CProtocol
DStruct
✗ Incorrect
Structs are value types and copy their data, so changes do not affect other copies.
Why is understanding reference sharing important?
ATo use more memory
BTo write faster code
CTo avoid unexpected changes and bugs
DTo avoid using classes
✗ Incorrect
Knowing how references work helps prevent bugs caused by unexpected changes to shared data.
Explain reference sharing in Swift and how it can lead to side effects.
Think about how classes work compared to structs.
You got /4 concepts.
Describe the difference between value types and reference types in Swift with examples.
Consider what happens when you assign or pass these types.
You got /4 concepts.
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
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.
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.
Final Answer:
Both variables refer to the same object; changes affect both. -> Option C
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
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.
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.
Final Answer:
let obj1 = MyClass(); let obj2 = obj1 -> Option A
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
Step 1: Understand reference sharing in class instances
box1 and box2 both refer to the same Box object because classes are reference types.
Step 2: Effect of changing box2.value
Changing box2.value to 20 changes the single shared object, so box1.value also reflects 20.
Final Answer:
20 -> Option A
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
Step 1: Analyze reference sharing in the code
p1 and p2 both point to the same Person instance because Person is a class.
Step 2: Effect of changing p2.name
Changing p2.name to "Bob" changes the shared object, so p1.name also becomes "Bob".
Final Answer:
Nothing is wrong; output is "Bob". -> Option B
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
Step 1: Understand copying behavior of classes
Classes in Swift do not copy on assignment; variables share references by default.
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.
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.
Final Answer:
Make the class conform to NSCopying and implement copy(with:), then use copy(). -> Option D
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 unknownstrongwhile earning +1 Grip toward your certificate.