Convenience initializers help you create objects easily by providing shortcuts to set up common values.
Convenience initializers in Swift
convenience init(parameters) { self.init(otherParameters) // additional setup }
A convenience initializer must call another initializer from the same class.
It cannot fully initialize the object alone; it relies on a designated initializer.
class Car { var color: String var model: String init(color: String, model: String) { self.color = color self.model = model } convenience init(model: String) { self.init(color: "Black", model: model) } }
class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(size: Double) { self.init(width: size, height: size) } }
This program shows a class with a main initializer and a convenience initializer that sets a default author.
class Book { var title: String var author: String init(title: String, author: String) { self.title = title self.author = author } convenience init(title: String) { self.init(title: title, author: "Unknown") } } let book1 = Book(title: "Swift Basics", author: "Alice") let book2 = Book(title: "Learning Swift") print("Book1: \(book1.title) by \(book1.author)") print("Book2: \(book2.title) by \(book2.author)")
Convenience initializers make your code cleaner and easier to use.
They always call a designated initializer to ensure the object is fully set up.
Convenience initializers can call other convenience initializers from the same class, but the chain must end with a designated initializer.
Convenience initializers provide easy shortcuts to create objects.
They must call a designated initializer in the same class.
Use them to avoid repeating code and to offer default values.
Practice
convenience initializer in Swift?Solution
Step 1: Understand the role of convenience initializers
Convenience initializers are shortcuts to create objects more easily by calling a designated initializer.Step 2: Compare options with this role
Only To provide an easier way to create an object by calling a designated initializer describes this purpose correctly; others describe unrelated concepts.Final Answer:
To provide an easier way to create an object by calling a designated initializer -> Option AQuick Check:
Convenience initializer = shortcut calling designated initializer [OK]
- Thinking convenience initializers create objects independently
- Confusing convenience initializers with deinitializers
- Believing convenience initializers override superclass initializers
Solution
Step 1: Recall the correct syntax for convenience initializers
In Swift, the keywordconveniencecomes beforeinitwithout any function keyword.Step 2: Check each option
convenience init(name: String) { self.init() } matches the correct syntax. Options B, C, and D misuse keywords or order.Final Answer:
convenience init(name: String) { self.init() } -> Option DQuick Check:
Keyword order: convenience before init [OK]
- Placing 'convenience' after 'init'
- Using 'func' keyword with initializers
- Incorrect keyword order causing syntax errors
class Car {
var color: String
init(color: String) {
self.color = color
}
convenience init() {
self.init(color: "Red")
}
}
let myCar = Car()What is the value of
myCar.color?Solution
Step 1: Understand the initializers in the Car class
The designated initializer sets the color property. The convenience initializer calls the designated one with "Red".Step 2: Analyze the object creation
CreatingmyCarwithCar()calls the convenience initializer, which sets color to "Red".Final Answer:
"Red" -> Option BQuick Check:
Convenience init sets color to "Red" [OK]
- Assuming color is empty or nil without initialization
- Thinking convenience init does not call designated init
- Expecting compilation error due to missing default init
class Person {
var name: String
convenience init() {
self.name = "Unknown"
}
init(name: String) {
self.name = name
}
}Solution
Step 1: Recall rules for convenience initializers
A convenience initializer must call another initializer in the same class, not assign properties directly.Step 2: Check the convenience init implementation
Here,self.name = "Unknown"is assigned directly, which is not allowed.Final Answer:
Convenience initializer must call a designated initializer, not assign properties directly -> Option AQuick Check:
Convenience init must call designated init [OK]
- Assigning properties directly in convenience initializer
- Marking designated initializer as convenience
- Making properties optional unnecessarily
Rectangle with a designated initializer that takes width and height, and a convenience initializer that creates a square by taking only one side length. Which of the following implementations correctly uses a convenience initializer?Solution
Step 1: Identify designated and convenience initializers
The designated initializer takes width and height. The convenience initializer should call the designated one.Step 2: Check each option for correct usage
class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(side: Double) { self.init(width: side, height: side) } } correctly defines the designated init and the convenience init calls it with equal sides. Others either misuse convenience keyword or assign properties directly.Final Answer:
class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(side: Double) { self.init(width: side, height: side) } } -> Option CQuick Check:
Convenience init calls designated init with side values [OK]
- Marking designated initializer as convenience
- Assigning properties directly in convenience initializer
- Not calling designated initializer from convenience initializer
Ready to prove it?
Pass the test and this pattern moves unknown
