私人var可以从课外访问

时间:2014-09-28 17:15:13

标签: swift swift2

这是在Playground完成的,只是为了简化。

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"

没有编译器警告。事实上,自动完成显示priv没有问题。 我的理解是,在班级{}的界限之外,我不应该看到私人的任何东西,funcvar

我错过了什么吗?

2 个答案:

答案 0 :(得分:45)

Swift中的访问修饰符的实现方式与其他语言不同。有三个级别:

private:只能在特定文件中访问

internal:只能在模块(项目)中访问

public:可从任何地方访问

除非另有说明,否则您编写的所有内容默认为internal

在测试版4中引入功能时Swift blog had a post about access control,以及Apple's documentation has a chapter

答案 1 :(得分:8)

注意:此答案适用于Swift 2


Swift编程语言表明:

  

Swift为您的实体提供三种不同的访问级别   码。这些访问级别是相对于其中的源文件   实体是定义的,也是相对于源文件的模块   属于。

如果您不想使用Swift测试private访问级别,以下一步一步可能会对您有所帮助。

1 /创建一个新的Xcode项目。

2 /创建一个文件 MyPrivateVar.swift ,并在其中添加以下代码:

class MyPrivateVar {

    private var priv: String? = nil

}

3 /创建第二个文件 MySecondClass.swift ,并在其中添加以下代码:

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

Xcode会立即给你一个Swift编译器错误信息:

  

'MyPrivateVar'没有名为'priv'的成员

4 /现在,从项目中删除前两个文件并创建一个文件 TwoClassesInAFile.swift ,其中包含以下代码:

class MyPrivateVar {

    private var priv : String? = nil

}

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

这次,您将不会收到任何Swift编译器错误消息,并且您将能够从MyPrivateVar访问priv的{​​{1}}私有财产,因为MySecondClass和{{ 1}}在同一个文件中(您的 TwoClassesInAFile.swift 文件)。

此外,访问级别也适用于全局变量。例如,如果以下代码是同一 ViewController.swift 文件的一部分,Xcode将不会给出任何编译器错误:

priv

但是,如果您在 ViewController.swift 之外定义MySecondClass,Xcode将生成错误消息:

  

使用未解析的标识符'globalPrivate'