Ios 将swift扩展标记为公共会将扩展中的属性更改为隐式公共还是内部?

Ios 将swift扩展标记为公共会将扩展中的属性更改为隐式公共还是内部?,ios,swift,Ios,Swift,因此,在苹果的文档中: 在扩展中添加的任何类型成员都具有与在要扩展的原始类型中声明的类型成员相同的默认访问级别。如果扩展公共或内部类型,则添加的任何新类型成员的默认访问级别为internal 提供UIView扩展的子类: extension UIViewSubClass { var helloWorld : String { get { return "helloWorld" } } } 这将把helloWorld标记为内

因此,在苹果的文档中:

在扩展中添加的任何类型成员都具有与在要扩展的原始类型中声明的类型成员相同的默认访问级别。如果扩展公共或内部类型,则添加的任何新类型成员的默认访问级别为internal

提供UIView扩展的子类:

extension UIViewSubClass
{
    var helloWorld : String {
        get {
            return "helloWorld"
        }
    }
}
这将把
helloWorld
标记为内部,我没有问题,在基于Objective-C的项目中我看不到它

但是,如果我将扩展标记为公共:

public extension UIViewSubClass
{
    var helloWorld : String {
        get {
            return "helloWorld"
        }
    }
}
现在,
helloWorld
出现在我基于Objective-C的代码中,这意味着它被标记为public

然而,我没有看到苹果提到这一点,是吗

我刚刚看到文档说公共类仍将具有隐式内部级别

public class SomePublicClass {          // explicitly public class
    public var somePublicProperty = 0    // explicitly public class member
    var someInternalProperty = 0         // implicitly internal class member
    private func somePrivateMethod() {}  // explicitly private class member
}
为扩展标记public似乎与标记类定义具有不同的效果。这让我很困惑


有人能帮帮我吗,这应该是这样的,还是这是一种迅捷的虫子?我支持swift 2.1和Xcode 7.2回答:是的,在扩展前面放置访问级别修饰符(在您的情况下,
public
),修改该扩展范围内所有新类型的默认访问级别

请注意,修饰符不影响被扩展的类/struct/etc的访问级别(仅影响其成员)。但是,正如我将在下面讨论的那样,有一些事情应该考虑


在本次讨论中,我将发布一些关于Swift访问级别的重要事实。所有这些都来自

让我们首先确保您已经说过:

代码中的所有实体(除了一些特定的例外,如 本章后面将介绍)具有默认访问级别 内部如果您自己没有指定明确的访问级别

好的,这与您在问题中引用的内容一致:任何新类型成员,无论是在类定义还是结构定义中,都将具有默认的内部访问级别

现在,让我们看看可以在扩展前面添加的访问级别修饰符

您可以在任何access中扩展类、结构或枚举 类、结构或枚举可用的上下文。 在扩展中添加的任何类型成员都具有相同的默认访问权限 级别为在要扩展的原始类型中声明的类型成员。如果 您可以扩展公共或内部类型,也可以扩展您添加的任何新类型成员 将具有默认的内部访问级别 类型,您添加的任何新类型成员的默认访问级别为 私人

或者,您可以使用显式访问级别标记扩展 修饰符(例如,专用扩展)设置新的默认访问权限 扩展中定义的所有成员的级别。此新默认值 仍然可以在单个类型的扩展中重写 成员们

这就解决了问题。我们看一下您的示例,并假设您的类
UIViewSubClass
具有访问级别
public
(或编译时错误,如下所示):

考虑到上面的讨论,您的
公共扩展中的
helloWorld
应该标记为
内部
,因为在这个上下文中,这是默认访问级别。在扩展上下文中,访问级别修饰符的工作方式与应用于类型时不同

最后,我们应该指出,在扩展非公共类时使用
public
access修饰符将在Swift中产生编译时错误。因此,在上面的例子中:

  • 如果
    UISubViewClass
    内部的
    私有的
    类,那么类上的
    公共扩展…
    将产生编译时错误
  • 如果
    UISubViewClass
    是一个
    public
    类,那么添加
    public扩展将是多余的,因为根据定义,public类的默认访问修饰符已经是
    public
我想说,上面描述的错误并不是为了避免运行时错误,而是为了避免冗余(和混乱)代码:
public
成员类型或
private
internal
类永远不会使用它
s
public`访问级别

class MyImplicitlyInternalClass {
    private var myExplicitlyPrivateVar = 0
    var myImplicitlyInternalVar = 0
    public var myExplicitlyPublicVar = 0 // warning, see (Note 1) below
        // redundant 'public': can never be accessed publicly
        // myExplicitlyPublicVar will behave as 'internal'
}

public extension MyImplicitlyInternalClass { // error, see (Note 2)
    var myNewVarIsInternal : Int { get { return 0 } } 
}
/* (Note 1) Compile type warning:
        "Declaring a public var for an internal class."

   (Note 2) Compile time error:
        "Extension of internal class cannot be declared public." 

   Summary: in theory, these two above are the same type of
            'faults', but only the latter is flagged as and error. */

因此,只有在扩展上使用访问级别修饰符才能使默认访问级别更加严格,即使用
公共
类的
内部扩展…
,或
私有扩展
内部
类的
内部扩展。

我错过了
的段落。或者,您可以标记带有显式访问级别修饰符的扩展。
。感谢您的详细回答!顺便说一句,我看到了您关于inout的另一篇帖子:)做得好,您擅长swift详细信息,朋友@Wingzero我可以理解您所做的,我认为Swift语言指南中的某些主题有时有点“分散”(在不同的章节中包含不同的理论)。不管怎样,很乐意帮忙,我在自学!
class MyImplicitlyInternalClass {
    private var myExplicitlyPrivateVar = 0
    var myImplicitlyInternalVar = 0
    public var myExplicitlyPublicVar = 0 // warning, see (Note 1) below
        // redundant 'public': can never be accessed publicly
        // myExplicitlyPublicVar will behave as 'internal'
}

public extension MyImplicitlyInternalClass { // error, see (Note 2)
    var myNewVarIsInternal : Int { get { return 0 } } 
}
/* (Note 1) Compile type warning:
        "Declaring a public var for an internal class."

   (Note 2) Compile time error:
        "Extension of internal class cannot be declared public." 

   Summary: in theory, these two above are the same type of
            'faults', but only the latter is flagged as and error. */