斯威夫特3.0
我知道fileprivate
访问级别修饰符限制对声明它的源文件的函数/属性的使用,并且private
- 仅限于声明的词法范围。但似乎这条规则不适用于延期。例如。此代码有效:
class Foo {
}
fileprivate extension Foo {
var aa: Int {
return aaa + 10
}
}
private extension Foo {
var aaa: Int {
return 20
}
}
有人可以帮我找出它们之间的区别吗?谢谢。
斯威夫特4.0
private
现在可以在扩展名中但在同一文件中访问。如果您在其他文件中声明/定义扩展,则您的扩展将无法访问您的私有变量。
fileprivate
可以在同一文件中访问。
仅当我们谈论类型成员时,差异才会出现。private
将限制对同一类型定义中其他方法的访问,而fileprivate
事物可以被生活在同一事物中的任何事物所访问.swift
file.
对于位于顶层(类型定义之外)的事物,private
and 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 https://twitter.com/slava_pestov/status/849858472476786688,一些 Swift 架构师同意你 https://github.com/apple/swift-evolution/blob/master/proposals/0159-fix-private-access-levels.md。我相信一些风格指南建议您只使用public
and private
访问修饰符(以及internal
修饰符,但默认情况下是这样),因为一般来说,基于每个文件(而不是基于每个模块或每个类型)进行限制并不是特别有用。
如果您必须使用fileprivate
修饰符,然后永远不要使用private
修饰符在类型范围之外。这很令人困惑(因为private
在这种情况下“真的”意味着fileprivate
)并使您的代码更难阅读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)