通过扩展对结构中的私有属性进行Swift 3访问

ste*_*tis 5 inheritance visibility swift

我一直在浏览快速的文档,并研究了有关封装的一些示例,但不确定我所看到的行为。我已经在堆栈上寻找了类似的问题,浏览了文档并浏览了一些教程(请参阅下面的链接),尽管这是一个琐碎的问题,但找不到答案(可能是因为Swift发生了变化?)

创建一个表示队列的简单Struct:

struct Queue<Element> {
private var elements = [Element]()
mutating func enqueue(newElement: Element) {
    elements.append(newElement)
}

mutating func dequeue() -> Element? {
    guard !elements.isEmpty else {
        return nil
    }
    return elements.remove(at: 0)
}
}
Run Code Online (Sandbox Code Playgroud)

后来扩展为:

extension Queue {
func peek() -> Element? {
    return elements.first
}
}
Run Code Online (Sandbox Code Playgroud)

但是由于私有保护级别的原因,元素当然不可访问。它通过将元素的访问权限更改为fileprivate来起作用-但是为什么呢?

我的理解是扩展是封闭类型的一部分,并期待在网络上似乎是使用这种方式工作https://www.andrewcbancroft.com/2015/04/22/3-nuances-of-swift-扩展/

那么我对可见性的理解是错误的,还是Swift发生了变化?

Cod*_*ent 4

来自斯威夫特的书

私有访问将实体的使用限制为封闭的声明。当特定功能的实现细节仅在单个声明中使用时,使用私有访问来隐藏这些细节。

因此,private变量只能在定义它的大括号组内访问。Swift 的访问控制从未像 C++、Java 或 C# 那样。