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)
}
}
我一直在查看 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)
}
}