0

引用Swift 编程语言(Swift 3.1)

可以为自定义初始化程序分配小于或等于它们初始化的类型的访问级别。唯一的例外是必需的初始化程序(如必需初始化程序中所定义)。必需的初始化程序必须具有与其所属的类相同的访问级别。

如果是这样,为什么这段代码可以编译和工作?

private class GoofyClass {
    public init(mood: String) {}
    public required init(isCrazy: Bool) {}
}

private let shock = GoofyClass(mood: "shocked")
private let crazy = GoofyClass(isCrazy: true)
4

1 回答 1

2

在 Swift 中,访问级别限制低于类/结构本身的类或结构的成员会自动降级到与类/结构相同的级别。我相信这是语言设计者深思熟虑的设计决定。

在您的情况下,假设该类是在文件的顶层声明的(即它没有嵌套在另一个类型中),那么init您声明的 spublic实际上是fileprivate.

唯一的例外是必需的初始化程序(如必需初始化程序中所定义)。必需的初始化程序必须具有与其所属的类相同的访问级别。

这是指您不能使所需初始化程序的访问级别比其类更具限制性,例如

open class Foo 
{
    internal required init() // error
}
于 2017-07-12T09:02:15.413 回答