Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift中的访问级别_Swift - Fatal编程技术网

swift中的访问级别

swift中的访问级别,swift,Swift,swift中的访问级别混乱 我正在试验类及其数据成员和子类的swift访问级别。 下面的代码在操场上运行良好,没有任何错误 我想我们只能给默认的访问级别是内部的。如果在类型上指定较窄的访问级别fileprivate或private,则其成员的访问级别只能与该类型的访问级别一样宽。但您不希望必须在类型的每个成员上写入更窄的访问级别 也就是说,您希望能够编写以下内容: 你不想写这个: 但是默认的访问级别是内部的。因此,Swift自动将成员的访问级别“钳制”到成员的指定或默认访问级别及其容器的访问级别

swift中的访问级别混乱

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


我想我们只能给默认的访问级别是内部的。如果在类型上指定较窄的访问级别fileprivate或private,则其成员的访问级别只能与该类型的访问级别一样宽。但您不希望必须在类型的每个成员上写入更窄的访问级别

也就是说,您希望能够编写以下内容:

你不想写这个:

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

是的,Swift还有其他方法可以处理这个问题,例如,在使用未写入的默认内部文件时,仅通过夹紧,但这就是它的实现方式。如果不破坏现有的源代码,现在就无法更改它

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

protocol P {
    var x: Int { get }
}

fileprivate struct S: P {
    var x: Int
}

func make() -> P { return S(x: 100) }
在本例中,make和p具有默认的内部访问级别,而类型S显式具有fileprivate访问级别,其成员x具有有效的fileprivate访问级别


但是,您可以从模块中的任何其他文件调用make。您将得到一个S,但您只能将其视为一个P。因为它是一个P,所以您可以读取其x属性,即使S的x属性具有有效的访问级别fileprivate。

前3个看起来不错。不知道为什么其余的东西并没有抛出任何错误。你们的问题是什么?例如,有可能有一个带有公共数据成员/属性/函数的内部类吗?或者可以在私有类中包含公共数据成员/属性/函数吗?属性的访问权限不能高于其类型,因此不是它所属的类型,而是它所定义的类型。例如,x和y可以在点中声明为公共的,因为它们的类型Int也是公共的。点上的访问器在此不相关。如果你在另一边添加一个Point属性来塑造它,那么它不能是公共的,但必须是FilePrivate我很困惑,你能告诉我在下面的代码中x和y的访问级别是什么吗:private类Point{public var x:Int?public var y:Int?}x和y的有效访问级别是private的。我想这意味着,但可能不是直接表达的,就是说可以声明一个子组件作为它的方法,类型或属性的访问级别比其父级更为开放,并且不会出现错误(如上文所述),但这些组件的实际访问级别在其层次结构中是最严格的,因此x和y将从其父结构继承private。
// 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
}
protocol P {
    var x: Int { get }
}

fileprivate struct S: P {
    var x: Int
}

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