Ios 为什么在类外声明的私有变量可以是同一文件上的access类?

Ios 为什么在类外声明的私有变量可以是同一文件上的access类?,ios,swift,Ios,Swift,在研究iOS内容时,我遇到了这个在类外声明的private var,它可以访问任何类中的private var。私有定义是任何只能在类本身中访问,而不能在其他类中访问的类型 private let outside: String = "private-let?" class LoginVC: UIViewController { override func viewDidLoad() { super.viewDidLoad()

在研究iOS内容时,我遇到了这个在类外声明的
private var
,它可以访问任何类中的private var。私有定义是任何只能在类本身中访问,而不能在其他类中访问的类型

private let outside: String = "private-let?"

class LoginVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(outside)
    }
}

假设我们有一个文件
Helper.swift
,因为我们的私有变量在类之外,这使得它可以全局访问

private let outside: String = "private-let?"

class LoginVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(outside)
    }
}
访问私有成员时,不会得到任何编译时错误,因为您的类位于同一个文件中。但若两个类位于不同的文件中,那个么您将得到编译时错误

//Since this private variable is outside the class So its Global and accessible to any class within file.
private var secretCode : String? = nil

class MyPrivateData {
 init() {
    secretCode = "First change"
  }
}

class MySecondClass {

    init() {
       secretCode = "Second change"
    }

}

假设我们有一个文件
Helper.swift
,因为我们的私有变量在类之外,这使得它可以全局访问

private let outside: String = "private-let?"

class LoginVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(outside)
    }
}
访问私有成员时,不会得到任何编译时错误,因为您的类位于同一个文件中。但若两个类位于不同的文件中,那个么您将得到编译时错误

//Since this private variable is outside the class So its Global and accessible to any class within file.
private var secretCode : String? = nil

class MyPrivateData {
 init() {
    secretCode = "First change"
  }
}

class MySecondClass {

    init() {
       secretCode = "Second change"
    }

}

声明类或结构范围之外的任何变量将使其成为一个全局变量

private let outside: String = "private-let?"

class LoginVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(outside)
    }
}
因此,在您的情况下,即使您全局创建一个私有常量或变量,它也将在您在该文件中定义的所有类中可用。因此,访问级别将被视为该文件级别的范围

如果将其公开,它也将在其他文件类中可用

了解更多关于变量的信息


阅读有关

的更多信息,声明类或结构范围之外的任何变量将使其成为一个全局变量

private let outside: String = "private-let?"

class LoginVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(outside)
    }
}
因此,在您的情况下,即使您全局创建一个私有常量或变量,它也将在您在该文件中定义的所有类中可用。因此,访问级别将被视为该文件级别的范围

如果将其公开,它也将在其他文件类中可用

了解更多关于变量的信息


阅读更多有关

专用
用于类型声明的信息。否则就没有意义了。当
private
在没有意义的地方使用时,它将被重新解释为
fileprivate
。这就是这里发生的事情。此代码位于同一文件中,因此
fileprivate
变量可见。

private
用于类型声明中。否则就没有意义了。当
private
在没有意义的地方使用时,它将被重新解释为
fileprivate
。这就是这里发生的事情。此代码位于同一个文件中,因此
fileprivate
变量可见。

如果它是fileprivate,则此操作有效。你不能将私有类成员访问到其他类。是的。但在这里,私有变量并没有定义在任何类中,所以可以从同一文件中的任何类访问它。因为它不属于任何类别。但在您的示例代码中,它是在类中定义的,因此会给您带来编译时错误。@ParthAdroja我以前错过了它。然后我在评论中更正了。Thanks@Kudos,但Swift文档中的私有定义是“私有访问限制实体的使用仅限于所附声明以及同一文件中该声明的扩展名”。private let outside位于类之外,并且没有在类、结构、函数等的任何封闭块内声明。fileprivate在这里可能是合理的,因为它的定义可以在同一个文件上访问,但我的问题是,为什么它可以访问,即使它没有在类、结构的块内声明。如果它是fileprivate,这将起作用。你不能将私有类成员访问到其他类。是的。但在这里,私有变量并没有定义在任何类中,所以可以从同一文件中的任何类访问它。因为它不属于任何类别。但在您的示例代码中,它是在类中定义的,因此会给您带来编译时错误。@ParthAdroja我以前错过了它。然后我在评论中更正了。Thanks@Kudos,但Swift文档中的私有定义是“私有访问限制实体的使用仅限于所附声明以及同一文件中该声明的扩展名”。private let outside位于类之外,没有在类、结构、函数等的任何封闭块内声明。fileprivate在这里可能是合理的,因为它的定义可以在同一个文件上访问,但我的问题是,为什么它可以访问,即使它没有在类、结构的块内声明。谢谢您的回复,但它声明为private,而不是fileprivate。据我所知,当变量声明为fileprivate时,它只能在该文件的任何位置访问。另一方面,这意味着private let outside变量变成了某种fileprivate?@IrisReyes当您将该变量声明为全局变量时,访问级别private将作为该文件的private应用,这意味着它将无法在文件外部访问,但可以在文件内部访问。fileprivate&private在其全局变量或let时将具有相同的行为。@JoakimDanielson仔细阅读此内容,以了解if将如何推断访问级别。感谢您的回复,但它声明为private,而不是fileprivate。据我所知,当变量声明为fileprivate时,它只能在该文件的任何位置访问。另一方面,这意味着private let outside变量变成了某种fileprivate?@IrisReyes当您将该变量声明为全局变量时,访问级别private将作为该文件的private应用,这意味着它将无法在文件外部访问,但可以在文件内部访问。fileprivate&private在其全局var或let时将具有相同的行为。@JoakimDanielson仔细阅读此内容,以了解if将如何推断ac