私有枚举中案件的访问级别是多少

时间:2019-06-17 09:48:18

标签: swift

我从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

2 个答案:

答案 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,反之亦然。因此,我们现在将苹果与苹果进行比较。)

但是privatesomePrivateProperty的意思是其他。它的意思是“此类型内的私有 ”。因此,只有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)