【发布时间】:2017-07-12 00:34:47
【问题描述】:
引自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)
【问题讨论】:
-
为什么不应该呢?没有超类,对吧?虽然声明为
public,但您有一个init(isCrazy:)- 看起来不错 - 和第二个init(mood:)。我能看到您遇到的唯一问题是您没有说明的问题 - 初始值是public,类是private。是的,我很惊讶它的构建(可能是 Xcode 8.3 编译器中的一个错误?),但我认为你不会轻易让你的应用程序在尝试初始化private类时崩溃。 -
我在这里唯一的意思是
private类和public初始化程序。这就是为什么我贴出书中的引文。 :) -
经过进一步调查,我发现协议的访问级别行为也与书中所述不同。它可能是一个错误的编译器。
-
这是在游乐场吗?即使您将一个类声明为私有类,它仍然可以在同一个 Playground 文件中访问。
-
是的,这是游乐场。我知道它可以在同一个文件中访问,但它是否解释了为什么编译器允许在内部声明更高的访问级别?
标签: swift swift3 xcode8 access-levels