如果使用默认值

时间:2017-05-01 07:40:18

标签: swift

我正在阅读带有默认值和便利初始化程序的指定初始化程序,我对它们有点困惑。如果我可以使用默认值实现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!")

2 个答案:

答案 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)" 课程。它有一个Rectanglewidth

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会警告您。但是每次无缘无故地这样做会令人烦恼。

enter image description here

您不能更改UIStoryboard类的默认init方法。你该怎么办??只需创建UIStoryboard的扩展并使用便捷的初始化程序即可。

这种方便的初始化方法可以帮助您更好地编码。

enter image description here

如上所述,在开发过程中可能需要添加自定义初始化的多种情况。要记住的一件事是指定的初始化程序必须始终委派(到基类/超级类)。 便利的初始化程序必须始终委派。