加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:26:30 所属栏目:百科 来源:网络整理
导读:Swift 3.0 我知道fileprivate访问级别修饰符限制使用函数/属性来源文件声明它和私有 – 限于声明的词法范围.但似乎这条规则不适用于扩展.例如.此代码有效: class Foo {}fileprivate extension Foo { var aa: Int { return aaa + 10 }}private extension Foo
Swift 3.0

我知道fileprivate访问级别修饰符限制使用函数/属性来源文件声明它和私有 – 限于声明的词法范围.但似乎这条规则不适用于扩展.例如.此代码有效:

class Foo {
}

fileprivate extension Foo {
    var aa: Int {
        return aaa + 10
    }
}

private extension Foo {
    var aaa: Int {
        return 20
    }
}

有人可以帮我弄清楚它们之间的区别吗?谢谢.

Swift 4.0

private现在可以在扩展名中访问,但在同一个文件中.如果您在其他文件中声明/定义扩展名,则扩展程序将无法访问您的私有变量.

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,一些Swift架构师agree with you.我相信一些样式指南建议您只使用公共和私有访问修饰符(以及内部修饰符,但默认情况下那个),因为,通常,基于每个文件限制事物,而不是基于每个模块或每个类型限制事物并不是特别有用.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读