我从swift.org阅读了有关Swift 5.1的文档,并对枚举的访问级别有一些疑问。
https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html#ID14
在文档中说:
枚举的各个个案自动获得与其所属枚举相同的访问级别。
private enum SomePrivateEnum {
case one
case two
case three
}
private class SomePrivateClass {
private var somePrivateProperty = 0
}
// work
print(SomePrivateEnum.one)
// error: 'somePrivateProperty' is inaccessible due to 'private' protection level
print(SomePrivateClass().somePrivateProperty)
根据文档,如果我有一个private
枚举,则所有情况都应获得private
访问级别。问题是,为什么我可以在枚举声明之外访问私有案例?此行为不同于Class
。
答案 0 :(得分:1)
首先,您的代码是完全人为的,因为除了在操场上,它甚至都不会编译-并且在操场上,隐私的概念或多或少毫无意义。仅在真实项目中进行测试。
执行此操作时,您将得到以下内容:
private enum SomePrivateEnum {
case one
case two
case three
}
private class SomePrivateClass {
private var somePrivateProperty = 0
}
class ViewController : UIViewController {
func test() {
print(SomePrivateEnum.one)
print(SomePrivateClass().somePrivateProperty)
}
}
现在我们已经确定,我们可以继续进行测试本身的问题,即您正在比较苹果和橙子。这是并行性:
print(SomePrivateEnum.one) // ok
print(SomePrivateClass()) // ok
因此,{PearateEnum的private
和SomePrivateClass的private
含义相同,即:“此文件内的私有 ”。此代码在同一文件中,因此可以看到SomePrivateEnum和SomePrivateClass。 (正如文档所告诉您的,可以看到SomePrivateEnum的代码可以看到SomePrivateEnum.one
,反之亦然。因此,我们现在将苹果与苹果进行比较。)
但是private
中somePrivateProperty
的意思是其他。它的意思是“此类型内的私有 ”。因此,只有SomePrivateClass内部的代码才能看到somePrivateProperty
。该代码不在SomePrivateClass内部,因此看不到该属性。
答案 1 :(得分:0)
您可以在当前上下文中访问private
声明。
例如,如果用其他上下文包装枚举-将无法像访问SomePrivateClass
中的属性那样访问它。
即这将无法访问:
struct Foo {
private enum SomePrivateEnum {
case one
case two
case three
}
}
print(Foo.SomePrivateEnum.one)
这将是:
private class SomePrivateClass {
var somePrivateProperty = 0
}
print(SomePrivateClass().somePrivateProperty)