公共课的Swift初始化程序

时间:2015-11-20 16:24:41

标签: swift initializer

创建公共类时,是否有必要公开指定的初始化程序?

公开与否之间的区别是什么?

e.g。

public class A {
  init() {}
}

public class A {
  public init() {}
}

2 个答案:

答案 0 :(得分:2)

您无需公开。事实上,你可以把它变成私人的。关于指定初始化程序(并且允许多个类)的唯一特殊之处在于它们负责确保对象完全初始化。

便利初始化程序(指定初始化程序或方便)(由convenience关键字标记)不承担此责任。便捷初始化器首先委托给指定的初始化器,然后在返回之后,它有机会覆盖一些初始值。重要的是,便利初始化程序必须始终"委托跨越"。它必须始终在类中调用另一个初始化器。

相比之下,指定的初始值设定项(未使用convenience关键字标记的任何初始值设定项)必须负责确保类中的每个属性都获得有效的初始值,然后必须"委派给出#&#34 34; (如果有超类,则调用超类初始值设定项),然后可以根据需要覆盖值。

但是没有什么可以阻止你创建一个除了私有指定的初始化器之外什么都没有的类。(

即使我们从具有required初始化程序的类继承,我们的子类也可以简单地将该初始化程序实现为便捷初始化程序。

class ParentClass {
    let foo: Int

    required init(foo: Int) {
        self.foo = foo
    }
}

class ChildClass: ParentClass {
    let bar: Int

    private init(foo: Int, bar: Int) {
        self.bar = bar
        super.init(foo: foo)
    }

    required convenience init(foo: Int) {
        self.init(foo: foo, bar: foo)
    }
}

以上是完全有效的Swift。

ChildClass有一个私人指定的初始化程序。它继承自具有必需初始化程序的父类,但它已将该初始化程序实现为便捷初始化程序。 (此外,与此处评论中的猜想和其他问题相反,required初始化程序实际上不一定必须public ...上下文很重要,也许我会在回答你的另一个问题时扩展它。)

此外,与subjective_c's answer形成鲜明对比的是,您不必使用Swift代码public的一部分来使用Objective-C中的代码,以及来自Apple的代码他在答案中引用的实际表明了这一点。您只需要公开您希望在实施代码的框架之外可用的内容。你可以把Objective-C&同一应用程序中的Swift代码和Objective-C代码可以看到标记为publicinternal的任何内容。

答案 1 :(得分:1)

除非您将其作为Objective-C中的使用框架提供,否则您无需公开。

请参阅:https://developer.apple.com/swift/blog/?id=5

  

当混合Objective-C和Swift时,因为生成的头部为   框架是框架的公共Objective-C接口的一部分,   只有标记为public的声明才会出现在生成的标题中   Swift框架。