【问题标题】:Access levels in swift快速访问级别
【发布时间】:2019-10-25 03:35:28
【问题描述】:

swift 中的访问级别混乱。

我正在试验类及其数据成员和子类的快速访问级别。 下面的代码在操场上运行良好,没有任何错误。

我认为我们只能为类数据成员提供

但下面的代码在操场上没有任何错误。

1.
public struct Student{
    private var studentId : String
}
2.
open class Employee{
    open var EmployeeId : String?
}
3.
private class CompanyEmployee : Employee{

}
4.
internal class Animal{
    public var no_of_legs : Int?
    open var name : String?
}
5.
fileprivate class Shape{
    public var shape_type : String?
}
6.
private class Point{
    public var x : Int?
    public var y : Int?
}
7.
fileprivate class SpecificPoint : Point{

}

【问题讨论】:

  • 前 3 个看起来不错。不知道为什么其余的东西没有抛出任何错误。
  • 你有什么问题?
  • 例如。是否可以拥有具有公共数据成员/属性/功能的内部类?或者是否可以在私有类中拥有公共数据成员/属性/函数?
  • 一个属性不能有比它的类型更高的访问权限,所以不是它所属的类型,而是它定义的类型。因此,例如 x 和 y 可以在 Point 中声明为公共,因为它们的类型 Int 也是公共的。 Point 上的访问器与此处无关。如果您在另一边将Point 属性添加到Shape,则它不能公开,但必须是fileprivate

标签: swift


【解决方案1】:

默认访问级别为internal。如果您在类型上指定较窄的访问级别(fileprivateprivate),则其成员的访问级别只能与类型的访问级别一样宽。但是您不希望必须为该类型的每个成员编写更窄的访问级别。

也就是说,你希望能够这样写

// Only specify narrower access for the type, not for the type's members.
fileprivate struct Point {
    var x: Double
    var y: Double
}

你不想写这个:

// Specify narrower access for the type and its members.
fileprivate struct Point {
    fileprivate var x: Double
    fileprivate var y: Double
}

但默认访问级别是internal。因此,Swift 会自动将成员的访问级别“限制”为成员指定或默认访问级别及其容器访问级别中较窄的一个。

是的,Swift 有其他方法可以处理这个问题(例如,仅在使用未写入的默认 internal 时进行钳位),但这就是它的实现方式。现在不能在不破坏现有源代码的情况下对其进行更改。


值得注意的是,类型或成员可以具有狭窄的访问级别,但实际上通过协议一致性更易于访问。考虑这个例子:

protocol P {
    var x: Int { get }
}

fileprivate struct S: P {
    var x: Int
}

func make() -> P { return S(x: 100) }

在此示例中,makeP 具有默认的 internal 访问级别,而类型 S 显式具有 fileprivate 访问级别,其成员 x 具有有效的 fileprivate 访问级别。

但是,您可以从模块中的任何其他文件调用make()。你会得到一个S,但你只能把它当作P。由于它是P,因此您可以读取它的x 属性,即使Sx 属性具有有效的访问级别fileprivate

【讨论】:

  • 我很困惑,你能告诉我下面代码中 x 和 y 的访问级别是什么: private class Point{ public var x : Int?公共变量 : Int? }
  • xy的有效访问级别为private
  • 我认为暗示但可能没有直接表达的观点是,可以声明一个具有比它更开放的访问级别的子组件(无论是方法、类型还是属性) parent 并且它不会出错 - 就像上面的 Point 一样 - 但这些组件的实际访问级别将是其层次结构中最严格的 - 所以你的 xy 将从它们的父结构继承 private .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2018-09-26
  • 2021-06-20
  • 2020-07-22
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多