Swift public class 的初始值设定项

Swift initializer for public class

创建publicclass时,是否需要指定初始化器public?

成功与否有什么区别?public

例如

public class A {
  init() {}
}

public class A {
  public init() {}
}

您不需要将其设置为 public,除非您将其设置为可在 Objective-C 中使用的框架。

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

When mixing Objective-C and Swift, because the generated header for a framework is part of the framework’s public Objective-C interface, only declarations marked public appear in the generated header for a Swift framework.

没有

您不需要做到 public。事实上,您可以将其设为私有。指定初始化程序(并且您的 class 允许多个)唯一的特殊之处在于它们负责确保对象被完全初始化。

便利初始化器(一个初始化器要么是指定的要么是方便的)(由convenience关键字标记)没有这个责任。便利初始化器首先委托给指定初始化器,然后returns,它有机会覆盖一些初始值。重要的是,便利初始化器必须始终“委托”。它必须始终在 class.

中调用另一个初始化程序

相比之下,指定初始化器(任何未标记 convenience 关键字的初始化器)必须负责确保 class 中的每个 属性 都获得有效的初始值,然后它必须“向上委托”(调用超级 class 初始化程序,如果有超级 class),然后它可以根据需要覆盖值。

但是没有什么能阻止你创建一个 class 只用私有指定的初始值设定项(什么都没有)。

即使我们从带有 required 初始化器的 class 继承,我们的 subclass 也可以简单地将该初始化器实现为方便的初始化器。

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 有一个私有的指定初始化器。它从父 class 继承了一个必需的初始化器,但它将该初始化器实现为一个方便的初始化器。 (此外,与您在此处的评论和其他问题中的猜想相反, required 初始值设定项实际上不一定是 public ......上下文很重要,也许我会扩展这是对你其他问题的回答。)


此外,与 形成鲜明对比的是,您无需编写 Swift 代码的一部分 public 即可使用 Objective-C 中的代码,而他在回答中引用的来自 Apple 的文章实际上表明了这一点。您只需标记 public 您希望在已实现代码的 框架 之外可用的内容。您 可以 将 Objective-C 和 Swift 代码放在同一应用程序中,并且 Objective-C 代码可以看到任何标记为 publicinternal.