fileprivate和私有扩展之间的区别?

时间:2017-04-07 21:17:34

标签: swift3 swift4 access-control access-modifiers access-levels

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可在同一档案中访问。

2 个答案:

答案 0 :(得分:7)

当我们谈论类型成员时,差异才会出现。 private将限制对同一类型定义中的其他方法的访问,而fileprivate内容可以由位于同一.swift文件中的任何内容访问。

对于生活在顶层(类型定义之外)的内容,privatefileprivate 执行完全相同的操作。所以当你写

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。我相信某些样式指南建议您只使用publicprivate访问修饰符(以及internal修饰符,但默认情况下这是默认值),因为通常会限制事物在每个文件的基础上,与每个模块或每个类型相反,并不是特别有用。

如果必须使用fileprivate修饰符,则永远不要在类型范围之外使用private修饰符。令人困惑(因为该上下文中的private“真的”意味着fileprivate)并且使您的代码更难以阅读。

答案 1 :(得分:3)

  

使用Swift 4.0,privatefileprivate的范围得到扩展。
私人现在可以在同一个文件中访问,在实际的类/扩展名之外。如果您在其他文件中声明/定义您的扩展名,那么当您的私有变量无法访问时,fileprivate将起作用


文件专用
文件专用访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些详细信息时,使用文件专用访问来隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}


私人
私人访问限制实体对封闭声明的使用,以及对同一文件中声明的扩展的限制。当这些详细信息仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}


以下是有关所有访问级别的详细信息:Swift - Access Levels