Swift 3.0
我知道fileprivate
访问级别修饰符限制使用函数/属性来源文件所在的位置和private
- 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效:
class Foo {
}
fileprivate extension Foo {
var aa: Int {
return aaa + 10
}
}
private extension Foo {
var aaa: Int {
return 20
}
}
有人可以帮助我找出它们之间的区别吗?感谢。
Swift 4.0
private
现在可以在扩展名中访问,但在同一个文件中。如果您在其他文件中声明/定义扩展名,则扩展程序将无法访问您的私有变量。
fileprivate
可在同一档案中访问。
答案 0 :(得分:7)
当我们谈论类型成员时,差异才会出现。 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,那么一些Swift架构师agree with you。我相信某些样式指南建议您只使用public
和private
访问修饰符(以及internal
修饰符,但默认情况下这是默认值),因为通常会限制事物在每个文件的基础上,与每个模块或每个类型相反,并不是特别有用。
如果必须使用fileprivate
修饰符,则永远不要在类型范围之外使用private
修饰符。令人困惑(因为该上下文中的private
“真的”意味着fileprivate
)并且使您的代码更难以阅读。
答案 1 :(得分:3)
使用Swift 4.0,
private
和fileprivate
的范围得到扩展。
私人现在可以在同一个文件中访问,在实际的类/扩展名之外。如果您在其他文件中声明/定义您的扩展名,那么当您的私有变量无法访问时,fileprivate将起作用
文件专用
文件专用访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些详细信息时,使用文件专用访问来隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
的私人强>
私人访问限制实体对封闭声明的使用,以及对同一文件中声明的扩展的限制。当这些详细信息仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的详细信息:Swift - Access Levels