私人var可以从课外访问

bau*_*sic 33 swift swift2

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

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么吗?

Nat*_*ook 46

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

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

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

public:可从任何地方访问

除非另有说明,否则您写的所有内容都是internal默认的.

斯威夫特博客有一个关于访问控制后,当功能处于beta 4中引入和苹果的文档中有一章为好.

  • "_Private访问将实体的使用限制在其自己的定义源文件中.使用私有访问来隐藏特定功能的实现细节." 我猜当他们说"档案"时,他们实际上是指它.让一个`private`范围限制为不拥有类,而不是它所在的物理文件是没有多大意义的.我想在同一个文件中使用类不仅仅是方便,它具有功能意义.也许与"私人"标题有关,而不是在外面复制. (5认同)
  • 在Swift 3中,这将改变,所以`private`将声明限制在当前作用域,`fileprivate`(新的访问修饰符)将执行'私有'在Swift 3之前做的事.[本文](https:// swifting .io/blog/2016/08/17/22-swift-3-access-control-beta-6 /?utm_campaign =这个%2BWeek%2Bin%2BSwift&utm_medium = web&utm_source = This_Week_in_Swift_100)对Swift中的访问修饰符有一个很好的总结3. (5认同)
  • 答案中链接的博客文章介绍了这个非标准系统的一些原因,他们[另一篇文章说明了为什么他们没有包含"受保护"](https://developer.apple.com/swift/博客/?id = 11)更详细. (4认同)

Ima*_*tit 8

注意:这个答案适用于Swift 2


Swift编程语言指出:

Swift为代码中的实体提供三种不同的访问级别.这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关.

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

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

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

class MyPrivateVar {

    private var priv: String? = nil

}
Run Code Online (Sandbox Code Playgroud)

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

class MySecondClass {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

class MyPrivateVar {

    private var priv : String? = nil

}

class MySecondClass {

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

}
Run Code Online (Sandbox Code Playgroud)

这一次,您将不会收到Swift编译器错误消息,并且您将能够访问因为并且位于同一文件(您的TwoClassesInAFile.swift文件)中MyPrivateVarpriv私有属性.MySecondClassprivMySecondClass

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

import UIKit

private var globalPrivate : String? = nil

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        globalPrivate = "some string"
        println(globalPrivate)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,如果globalPrivateViewController.swift外部定义,Xcode将生成错误消息:

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