我正在阅读带有默认值和便利初始化程序的指定初始化程序,我对它们有点困惑。如果我可以使用默认值实现Initializer的所有功能,那么为什么要创建便利初始化器。
我在两个场景中都创建了一个示例并进行比较。
默认值的初始化程序:
class Cat {
var color:String
var age:Int
init(color:String = "black",age:Int = 1) {
self.color = color
self.age = age
}
}
便利初始化程序:
class Cat {
var color: String
var age: Int
//If both parameters color and age are given:
init (color: String, age: Int) {
self.color = color
self.age = age
}
//If only age is given:
convenience init (age: Int) {
self.init(color: "black", age: age)
}
//if only color is given:
convenience init (color: String) {
self.init(color: color, age: 1)
}
//if nothing given
convenience init () {
self.init(color: "black", age: 1)
}
}
初始化程序变量调用:
//创建Otto:
var Otto = Cat(color: "white", age: 10)
print("Otto is \(Otto.color) and \(Otto.age) year(s) old!")
//创建松饼:
var Muffins = Cat(age: 5)
print("Muffins is \(Muffins.color) and \(Muffins.age) year(s) old!")
//创建Bruno:
var Bruno = Cat(color: "red")
print("Bruno is \(Bruno.color) and \(Bruno.age) year(s) old!")
//创建Pico:
var Pico = Cat()
print("Pico is \(Pico.color) and \(Pico.age) year(s) old!")
答案 0 :(得分:1)
因为有时初始化课程并不是那么简单。让我们来看看这个var dateString: String? = (dic2["time"] as? String)
var interval: TimeInterval? = dateString?.doubleValue
var date = Date(timeIntervalSince1970: interval)
var format = DateFormatter()
format.dateFormat = "dd MMM, YYYY"
var datenewString: String = format.string(from: date)
cellNotification.lbldatenotificationN.text = "\(datenewString)"
课程。它有一个Rectangle
和width
:
height
在这里,您可以添加一个带有class Rectangle {
let width: Double
let height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
}
参数的便利初始化程序:
sideLength
或者,带有convenience init(sideLength: Double) {
self.init(width: sideLength, height: sideLength)
}
参数的便捷初始值设定项:
aFourthOf
这些情况很多。
答案 1 :(得分:0)
这是一个非常有趣的问题。
您始终可以使用指定的初始化程序进行初始化,但是顾名思义,它可以在出现一些复杂情况或罕见情况时简化初始化过程。 这是几个例子
1。。请看下面的示例,
class Cat {
var color: String
var age: Int
//If both parameters color and age are given:
init (color: String, age: Int) {
self.color = color
self.age = age
}
//If only age is provided:
convenience init (age: Int) {
self.init(color: "black", age: age)
}
//if only color is provided:
convenience init (color: String) {
self.init(color: color, age: 1)
}
//if nothing is provided
convenience init () {
self.init(color: "black", age: 1)
}
}
2。。创建故事板实例时,我们需要指定名称和捆绑。由于捆绑包是可选的,因此您可以将其指定为nil。此外,如果您未指定捆绑包,则XCode会警告您。但是每次无缘无故地这样做会令人烦恼。
您不能更改UIStoryboard类的默认init方法。你该怎么办??只需创建UIStoryboard的扩展并使用便捷的初始化程序即可。
这种方便的初始化方法可以帮助您更好地编码。
如上所述,在开发过程中可能需要添加自定义初始化的多种情况。要记住的一件事是指定的初始化程序必须始终委派(到基类/超级类)。 便利的初始化程序必须始终委派。