Bird
Raised Fist0
Swiftprogramming~20 mins

Classes are reference types in Swift - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Swift Class Reference Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of class instance assignment
What is the output of this Swift code?
Swift
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

let person1 = Person(name: "Alice")
let person2 = person1
person2.name = "Bob"
print(person1.name)
A"Alice"
B"Bob"
CCompilation error
D"person1"
Attempts:
2 left
💡 Hint
Remember that classes are reference types, so both variables point to the same instance.
❓ Predict Output
intermediate
2:00remaining
Effect of modifying a class property via one reference
What will be printed by this Swift code?
Swift
class Counter {
    var count = 0
}

let c1 = Counter()
let c2 = c1
c2.count += 5
print(c1.count)
A5
B0
CCompilation error
Dnil
Attempts:
2 left
💡 Hint
Both variables refer to the same instance, so changes via one affect the other.
🔧 Debug
advanced
2:00remaining
Why does this code print 20 instead of 5?
Consider this Swift code. Why does it print 20 instead of 5?
Swift
class Number {
    var value: Int
    init(value: Int) {
        self.value = value
    }
}

func doubleValue(_ num: Number) {
    num.value *= 2
}

let n = Number(value: 5)
doubleValue(n)
doubleValue(n)
print(n.value)
ABecause the function doubles the value once, but the print statement is wrong
BBecause the function doubles the value twice, so 5 * 2 = 10
CBecause classes are reference types, the same instance is modified twice, resulting in 20
DBecause the function doubles the same instance twice, so 5 * 2 * 2 = 20
Attempts:
2 left
💡 Hint
Trace the value changes step by step.
❓ Predict Output
advanced
2:00remaining
Output when copying class instance to a new variable
What is the output of this Swift code?
Swift
class Box {
    var content: String
    init(content: String) {
        self.content = content
    }
}

var box1 = Box(content: "Apple")
var box2 = box1
box2.content = "Orange"
print(box1.content)
A"Orange"
BRuntime error
C"box1"
D"Apple"
Attempts:
2 left
💡 Hint
Remember that assigning a class instance copies the reference, not the object.
❓ Predict Output
expert
3:00remaining
Output of modifying nested class references
What will this Swift code print?
Swift
class Engine {
    var horsepower: Int
    init(horsepower: Int) {
        self.horsepower = horsepower
    }
}

class Car {
    var engine: Engine
    init(engine: Engine) {
        self.engine = engine
    }
}

let engine1 = Engine(horsepower: 150)
let car1 = Car(engine: engine1)
let car2 = car1
car2.engine.horsepower = 200
print(car1.engine.horsepower)
A150
Bnil
CCompilation error
D200
Attempts:
2 left
💡 Hint
Both cars share the same engine instance because classes are reference types.

Practice

(1/5)
1. What happens when you assign an instance of a class to another variable in Swift?
easy
A. A new copy of the object is created.
B. Both variables refer to the same object in memory.
C. The original object is deleted.
D. The variables become constants automatically.

Solution

  1. Step 1: Understand class assignment behavior

    In Swift, classes are reference types, so assigning one instance to another variable copies the reference, not the object.
  2. Step 2: Effect of assignment on variables

    Both variables point to the same memory location, so changes via one variable affect the other.
  3. Final Answer:

    Both variables refer to the same object in memory. -> Option B
  4. Quick Check:

    Classes are reference types = A [OK]
Hint: Class assignment copies reference, not object [OK]
Common Mistakes:
  • Thinking a new object is created on assignment
  • Confusing classes with structs (value types)
  • Assuming variables become constants automatically
2. Which of the following is the correct way to declare a class in Swift?
easy
A. class Dog: String { var name }
B. struct Dog { var name: String }
C. class Dog { var name: String }
D. func Dog() { var name: String }

Solution

  1. Step 1: Identify correct class syntax

    In Swift, a class is declared using the keyword 'class' followed by the class name and curly braces containing properties.
  2. Step 2: Check each option

    class Dog { var name: String } correctly declares a class with a property. struct Dog { var name: String } declares a struct, not a class. class Dog: String { var name } has invalid syntax with inheritance from String and missing property type. func Dog() { var name: String } uses 'func' which is for functions, not classes.
  3. Final Answer:

    class Dog { var name: String } -> Option C
  4. Quick Check:

    Correct class syntax = A [OK]
Hint: Use 'class' keyword and braces for class declaration [OK]
Common Mistakes:
  • Using 'struct' instead of 'class'
  • Incorrect inheritance syntax
  • Using 'func' instead of 'class'
3. What will be printed by the following Swift code?
class Counter {
  var count = 0
}

let a = Counter()
let b = a
b.count = 5
print(a.count)
medium
A. 0
B. Compilation error
C. nil
D. 5

Solution

  1. Step 1: Understand reference assignment

    Variable 'b' is assigned to 'a', so both refer to the same Counter instance.
  2. Step 2: Effect of changing 'b.count'

    Changing 'b.count' to 5 changes the shared object's property, so 'a.count' also becomes 5.
  3. Final Answer:

    5 -> Option D
  4. Quick Check:

    Class references share data = 5 [OK]
Hint: Changing one reference changes all references [OK]
Common Mistakes:
  • Assuming 'a.count' stays 0 after changing 'b.count'
  • Expecting a compilation error
  • Confusing with value type behavior
4. Identify the error in this Swift code snippet:
class Person {
  var name: String
}

let p1 = Person()
p1.name = "Alice"
medium
A. Class Person cannot be instantiated with 'let'.
B. Cannot assign value to 'name' because it is a constant.
C. Missing initializer for 'name' property in class Person.
D. No error; code runs fine.

Solution

  1. Step 1: Check class property initialization

    The class Person has a non-optional property 'name' without an initial value or initializer.
  2. Step 2: Understand Swift's requirement for property initialization

    Swift requires all non-optional properties to be initialized before use, either with a default value or in an initializer.
  3. Final Answer:

    Missing initializer for 'name' property in class Person. -> Option A
  4. Quick Check:

    Non-optional properties need initialization = C [OK]
Hint: Non-optional properties must be initialized [OK]
Common Mistakes:
  • Thinking 'let' prevents property assignment
  • Assuming classes can't be instantiated with 'let'
  • Ignoring property initialization rules
5. You want to create a shared settings object that multiple parts of your app can modify and see updates immediately. Which approach best uses Swift classes to achieve this?
hard
A. Create a single instance of a Settings class and pass its reference around.
B. Create multiple instances of a Settings struct and copy them as needed.
C. Use global variables instead of classes for shared data.
D. Use a function that returns a new Settings object every time.

Solution

  1. Step 1: Understand shared mutable state with classes

    Classes are reference types, so a single instance shared by multiple parts allows changes to be seen everywhere.
  2. Step 2: Evaluate options for shared settings

    Create a single instance of a Settings class and pass its reference around. uses one shared instance, which fits the requirement. Create multiple instances of a Settings struct and copy them as needed. uses structs (value types), so copies won't reflect changes. Use global variables instead of classes for shared data. uses globals, which is not recommended for maintainability. Use a function that returns a new Settings object every time. creates new objects each time, so no shared state.
  3. Final Answer:

    Create a single instance of a Settings class and pass its reference around. -> Option A
  4. Quick Check:

    Shared mutable object = B [OK]
Hint: Use one shared class instance for shared mutable data [OK]
Common Mistakes:
  • Using structs which copy data instead of sharing
  • Relying on global variables for sharing
  • Creating new instances instead of sharing one
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