Swift 3 从扩展访问结构中的私有属性

Swift 3 access of private properties in a struct from a extension

我一直在查看 swift 文档并研究一些有关封装的示例,但不确定我所看到的行为。我在堆栈上寻找过类似的问题,浏览了文档并浏览了一些教程(参见下面的 link),虽然这是一个微不足道的问题,但找不到答案(可能是 Swift变了吗?)

创建表示队列的简单结构:

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)
}
}

后来扩展为:

extension Queue {
func peek() -> Element? {
    return elements.first
}
}

但是由于私有保护级别,当然无法访问元素。 它通过更改元素对 fileprivate 的访问来工作 - 但为什么呢?

我的理解是扩展是封闭类型的一部分,环顾网络似乎曾经以这种方式工作https://www.andrewcbancroft.com/2015/04/22/3-nuances-of-swift-extensions/

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

来自Swift's book

Private access restricts the use of an entity to the enclosing declaration. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration.

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

随着 Swift 4 的发布,如果扩展在同一个文件中实现,这已经改变。您可以在此处参考文档 Private Member in Extension

下面的例子来自Swift 4

protocol SomeProtocol {
    func doSomething()
}
struct SomeStruct {
    private var privateVariable = 12
}
extension SomeStruct: SomeProtocol {
    func doSomething() {
        print(privateVariable)
    }
}