【问题标题】:What is the use case for convenience initializer?便利初始化程序的用例是什么?
【发布时间】:2015-08-20 17:59:47
【问题描述】:

在 swift 中有指定初始化程序的概念(我假设这是我们从其他语言中知道的“普通”构造函数)。
但是还有一个叫做 Convenience Initializer 的东西,我确实知道如何编写,但我失去了重点。
如题,如果我理解正确的话,不写关键字convenience也能达到同样的效果吗?

【问题讨论】:

    标签: ios swift initialization swift2 convenience-methods


    【解决方案1】:

    据我了解,这些初始化程序的唯一要点是方便。有时会发生这种情况,我们经常需要一遍又一遍地创建一些具有相同参数的对象。在这种情况下,我们可以添加另一个 init 方法,它需要更少的参数,其余的都是硬编码的。

    例如一些 Logger 类

    init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)

    可能是我们经常使用带有相同参数的这个记录器。为了避免重复代码,我们可以添加一个带有一些默认值的便利初始化器

    convenience init(){ self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default) }

    【讨论】:

      【解决方案2】:

      其实很容易理解:它们是带有默认参数的初始化器。

      来自docs

      便利初始化器是次要的,支持类的初始化器。您可以定义一个便利初始化程序,以从与便利初始化程序相同的类中调用指定初始化程序,并将一些指定初始化程序的参数设置为默认值。您还可以定义便利初始化程序来为特定用例或输入值类型创建该类的实例。

      例子:

      class A {
          var a: Int
          var b : Int
      
          init() {
              a = 0
              b = 0
          }
      
          /*convenience*/ init(a: Int) {
              self.init()
              self.a = a
          }
      }
      

      在上述情况下,你不能调用self.init(),你已经用convenience关键字标记你的初始化器,否则会编译错误。所以你不能从同一个类中链接两个指定的初始化器。

      【讨论】:

      • 我知道这就是它们的用途,只是不是为什么我需要添加关键字方便...我可以在没有它的情况下创建它们,就像任何其他语言一样。
      • 但是添加显式的 'convenience' 关键字可能会很好地提醒您调用另一个初始化程序。
      • @Dániel,您也可以引用文档中的下一段:You do not have to provide convenience initializers if your class does not require them. Create convenience initializers whenever a shortcut to a common initialization pattern will save time or make initialization of the class clearer in intent.
      • 但是如果没有关键字 convenience 也一样,这是困扰我的主要问题,我怀疑我在这里遗漏了一些东西。
      • @ItayMoav-Malimovka 我添加了一个例子,它表明你不能链接指定的初始化器,所以你必须在上面的例子中使用convenience
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多