文件私有和私有扩展之间的区别?
Difference between fileprivate and private extension?
Swift 3.0
我知道 fileprivate
访问级别修饰符将 function/property 的使用限制在声明它的源文件中,而 private
- 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效:
class Foo {
}
fileprivate extension Foo {
var aa: Int {
return aaa + 10
}
}
private extension Foo {
var aaa: Int {
return 20
}
}
谁能帮我找出它们之间的区别?谢谢。
Swift 4.0
private
现在可以在扩展名中访问,但在同一文件中。如果您在其他文件中 declare/define 扩展名,那么您的扩展名将无法访问您的私有变量。
fileprivate
可在同一文件中访问。
只有在我们谈论类型成员时才会出现差异。 private
将限制对同一类型定义中其他方法的访问,而 fileprivate
同一 .swift
文件中的任何内容都可以访问这些内容。
对于位于顶层(类型定义之外)的事物,private
和 fileprivate
做完全相同的事情。所以当你写
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
private extension Foo
{
var aaa: Int
{
return 20
}
}
你真的写了
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
fileprivate extension Foo
{
var aaa: Int
{
return 20
}
}
最终,同一协议的两个扩展被编译器解析为一个扩展。
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
var aaa: Int
{
return 20
}
}
如果您认为拥有两个像这样的关键字是 stupid, some Swift architects agree with you。我相信一些风格指南建议您只使用 public
和 private
访问修饰符(以及 internal
修饰符,但默认情况下是这样),因为一般来说,限制事物基于每个文件,而不是基于每个模块或每个类型并不是特别有用。
如果必须使用 fileprivate
修饰符,则切勿在类型范围之外使用 private
修饰符。这很令人困惑(因为 private
在该上下文中“真的”意味着 fileprivate
)并且使您的代码更难阅读。
With Swift 4.0, scope of private
and fileprivate
is extended.
Private is now accessible within same file, outside actual class/extension. If you declare/define your extension in other file, then your private variable will not be accessible at that time fileprivate will work
文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
私人
私有访问将实体的使用限制为封闭声明,以及同一文件 中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的更多详细信息:Swift - Access Levels
Swift 3.0
我知道 fileprivate
访问级别修饰符将 function/property 的使用限制在声明它的源文件中,而 private
- 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效:
class Foo {
}
fileprivate extension Foo {
var aa: Int {
return aaa + 10
}
}
private extension Foo {
var aaa: Int {
return 20
}
}
谁能帮我找出它们之间的区别?谢谢。
Swift 4.0
private
现在可以在扩展名中访问,但在同一文件中。如果您在其他文件中 declare/define 扩展名,那么您的扩展名将无法访问您的私有变量。
fileprivate
可在同一文件中访问。
只有在我们谈论类型成员时才会出现差异。 private
将限制对同一类型定义中其他方法的访问,而 fileprivate
同一 .swift
文件中的任何内容都可以访问这些内容。
对于位于顶层(类型定义之外)的事物,private
和 fileprivate
做完全相同的事情。所以当你写
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
private extension Foo
{
var aaa: Int
{
return 20
}
}
你真的写了
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
fileprivate extension Foo
{
var aaa: Int
{
return 20
}
}
最终,同一协议的两个扩展被编译器解析为一个扩展。
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
var aaa: Int
{
return 20
}
}
如果您认为拥有两个像这样的关键字是 stupid, some Swift architects agree with you。我相信一些风格指南建议您只使用 public
和 private
访问修饰符(以及 internal
修饰符,但默认情况下是这样),因为一般来说,限制事物基于每个文件,而不是基于每个模块或每个类型并不是特别有用。
如果必须使用 fileprivate
修饰符,则切勿在类型范围之外使用 private
修饰符。这很令人困惑(因为 private
在该上下文中“真的”意味着 fileprivate
)并且使您的代码更难阅读。
With Swift 4.0, scope of
private
andfileprivate
is extended.
Private is now accessible within same file, outside actual class/extension. If you declare/define your extension in other file, then your private variable will not be accessible at that time fileprivate will work
文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
私人
私有访问将实体的使用限制为封闭声明,以及同一文件 中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的更多详细信息:Swift - Access Levels