📖 Scenario: Imagine you are managing a simple library system where books are borrowed and returned. When a book is no longer needed, it should clean up by announcing it is removed from the system.
🎯 Goal: You will create a Book class with a deinitializer that prints a message when a book object is removed from memory.
📋 What You'll Learn
Create a Book class with a title property
Add an initializer to set the title
Add a deinitializer that prints a message including the title
Create and remove book instances to see the deinitializer in action
💡 Why This Matters
🌍 Real World
Deinitializers are used in apps to release resources like files, network connections, or memory when objects are no longer needed.
💼 Career
Understanding deinitializers is important for Swift developers to write efficient, memory-safe apps and avoid resource leaks.
Progress0 / 4 steps
1
Create the Book class with a title property
Create a class called Book with a property title of type String. Add an initializer that takes a title parameter and sets the property.
Swift
Hint
Use class Book to define the class. Use let title: String for the property. Write an init method to set title.
2
Add a deinitializer to announce when a book is removed
Add a deinitializer deinit inside the Book class that prints "Removing book titled: \(title)".
Swift
Hint
Use deinit { } to define the deinitializer. Inside it, use print with the message including title.
3
Create a book instance and then remove it
Create a variable myBook and assign it a new Book instance with the title "Swift Programming". Then set myBook to nil to remove the instance.
Swift
Hint
Create myBook as an optional Book and assign it a new instance. Then set myBook = nil to trigger the deinitializer.
4
Run the program to see the deinitializer output
Run the program and observe the output. It should print Removing book titled: Swift Programming when myBook is set to nil.
Swift
Hint
When you run the program, the message from the deinitializer should appear in the output.
Practice
(1/5)
1. What is the main purpose of a deinitializer in Swift?
easy
A. To clean up resources before an object is destroyed
B. To initialize properties when an object is created
C. To manually call a function on an object
D. To create a new instance of a class
Solution
Step 1: Understand what a deinitializer does
A deinitializer runs automatically just before an object is destroyed to clean up resources like files or network connections.
Step 2: Compare options with the purpose
Only To clean up resources before an object is destroyed correctly describes this cleanup role. Options B and D describe initializers or object creation, and C is incorrect because deinitializers cannot be called manually.
Final Answer:
To clean up resources before an object is destroyed -> Option A
Quick Check:
Deinitializer purpose = cleanup before destruction [OK]
Hint: Deinitializer cleans up just before object is removed [OK]
Common Mistakes:
Confusing deinitializer with initializer
Thinking deinitializers can be called manually
Assuming deinitializers take parameters
2. Which of the following is the correct syntax for a deinitializer in a Swift class?
easy
A. func deinitializer() { }
B. func deinit() { }
C. init deinit() { }
D. deinit { }
Solution
Step 1: Recall Swift deinitializer syntax
In Swift, a deinitializer is declared with the keyword deinit without parentheses or parameters.
Step 2: Check each option
deinit { } matches the correct syntax: deinit { }. Options B, C, and D incorrectly use func or parentheses.
Final Answer:
deinit { } -> Option D
Quick Check:
Deinitializer syntax = deinit { } [OK]
Hint: Deinitializer uses just 'deinit' keyword with braces [OK]
Common Mistakes:
Adding parentheses after deinit
Using 'func' keyword with deinit
Trying to name the deinitializer function
3. What will be printed when the following Swift code runs?
Step 1: Trace object creation and deinitialization
When useFile() runs, it creates a FileHandler instance, printing "Opening file: data.txt". When the function ends, the local handler is destroyed, triggering the deinitializer which prints "Closing file: data.txt".
Step 2: Confirm output order
First the initializer message, then the deinitializer message appear in order.
Final Answer:
Opening file: data.txt
Closing file: data.txt -> Option A
Quick Check:
Init prints open, deinit prints close [OK]
Hint: Deinit runs after object goes out of scope [OK]
Common Mistakes:
Assuming deinit runs immediately after init
Thinking deinit never runs for local variables
Ignoring print statements in deinit
4. Identify the error in this Swift class related to deinitializers:
class Connection {
var isOpen = false
deinit() {
if isOpen {
print("Closing connection")
}
}
}
medium
A. Deinitializer cannot access instance variables
B. Deinitializer must return a value
C. Deinitializer cannot have parentheses
D. Deinitializer must be marked with 'func'
Solution
Step 1: Check deinitializer syntax
In Swift, deinitializers are declared without parentheses or parameters. The code incorrectly uses deinit() with parentheses.
Step 2: Verify other options
Deinitializers do not return values, can access instance variables, and do not use the func keyword. So options A, B, and D are incorrect.
Final Answer:
Deinitializer cannot have parentheses -> Option C
Quick Check:
Deinit syntax = no parentheses [OK]
Hint: Deinit never uses parentheses or func keyword [OK]
Common Mistakes:
Adding parentheses to deinit
Expecting return values from deinit
Using 'func' keyword with deinit
5. You have a class that manages a network connection and a file handle. How should you use a deinitializer to ensure both resources are properly closed when the object is destroyed?
class ResourceHandler {
var connection: NetworkConnection?
var file: FileHandle?
init(connection: NetworkConnection?, file: FileHandle?) {
self.connection = connection
self.file = file
}
deinit {
// What should go here?
}
}
hard
A. Do nothing; Swift cleans up automatically
B. Call connection.close() and file.close() inside deinit if they are not nil
C. Call init() again inside deinit to reset resources
D. Set connection and file to nil inside deinit
Solution
Step 1: Understand resource cleanup in deinitializer
Deinitializers are used to release resources like network connections and files. You should explicitly close these resources if they exist before the object is destroyed.
Step 2: Evaluate options for cleanup
Call connection.close() and file.close() inside deinit if they are not nil correctly calls close() methods on both resources if they are not nil. Set connection and file to nil inside deinit only sets references to nil but does not close resources. Call init() again inside deinit to reset resources is invalid because calling init inside deinit is not allowed. Do nothing; Swift cleans up automatically is incorrect because Swift does not automatically close external resources.
Final Answer:
Call connection.close() and file.close() inside deinit if they are not nil -> Option B
Quick Check:
Deinit must close resources explicitly [OK]
Hint: Close resources explicitly in deinit before object destruction [OK]
Common Mistakes:
Assuming setting variables to nil closes resources
Trying to call init inside deinit
Ignoring resource cleanup in deinit
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.