To develope my own app, I have browsed others github swift code. From a extension for making UIColor possible to use hex, I found convenience init
.
This is the reason I studied it.
extension UIColor {
convenience init(hex: Int) {
self.init(red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, blue: CGFloat(hex & 0x0000FF) / 255.0, alpha: 1)
}
}
They did not add those things on init()
but on convenience init()
.
Therefore, the question is..
What is the defference between (designated) init and convenience init?
Designated init is default initatializer in swift.
Designated init
helps initializing all of properties in that class or structure.
It has a condition to work which should initiate whole properties.
Below example shows us well about it.
class Fruit {
var name: String
var color: String
var price: Int
init(name: String, color: String, price: Int) {
self.name = name
self.color = color
self.price = price
}
}
What if remove self.price = price
?
Yes, compilier warns developer to initiate whole properties.
But then, how could you initialize only specific properties?
Yes, use convenience init
convenience init
set some parameters of designated init
which is given from developer as default value, and then initialize it.
From above sentence, you can predict designated init
should declared first before declaringconvenience init
.
Additionaly, convenience init
should call other initializer on same class.
Above things are two important rules to use convenience init
By adding convenience init
on Fruit class, developer can just type name and color.
Price will be fixed as 10.
class Fruit {
var name: String
var color: String
var price: Int
init(name: String, color: String, price: Int) {
self.name = name
self.color = color
self.price = price
}
convenience init(name: String, color: String) {
self.init(name: name, color: color, price: 10)
}
}
Conclusion
Convenience init is good to use as extension for additional initializer based on default.
UIColor example which I show you first is usueful way to use it!