使用swift 4访问扩展中的fileprivate和私有变量以及另一个类

aru*_*n_K 9 access-control access-specifier ios swift swift4

我一直在浏览最近的swift文档,并在swift4中了解私有和fileprivate关键字的几个例子.我试图在同一个类的扩展中访问fileprivate和private变量,并且另一个类继承类,但输出是无效的.我正在以下列方式使用

  class privateUsageExample: UIViewController {
    private var priVar = false
    fileprivate var fPriVar = false
  }

  // usage of extension in the same class

  extension privateUsageExample: UITextFieldDelegate {

     if priVar{ // do something} // error : expected declaration
     if fPriVar{ // do something} // error : expected declaration

     func randFunc(){ 
        self. fPriVar = true // accessible don't know the reason 
      }
  }

  // access of private and fileprivate variables in another class different file

  class anotherUsageInDiffSwiftFile: privateUsageExample {

   priVar = false // inaccessible (how to access it)
   fPriVar = true // inaccessible (how to access it)

 }
Run Code Online (Sandbox Code Playgroud)

你可以帮助我在同一个文件和同一个类的扩展中访问priVar(私有)和fPriVar(fileprivate)变量,并在另一个类中继承不同文件中的类.

Kru*_*nal 17

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

文件专用
文件专用访问将实体的使用限制在其自己的定义源文件中.当在整个文件中使用这些详细信息时,使用文件专用访问来隐藏特定功能的实现细节.
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}


私有
私有访问将实体的使用限制为封闭声明,以及同一文件中该声明的扩展.当这些详细信息仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节.
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}


以下是有关所有访问级别的更多详细信息:Swift - Access Levels

看看这个图像:
文件: ViewController.swift
这里扩展和视图控制器都在同一个文件中,因此私有变量testPrivateAccessLevel可以在扩展中访问

在此输入图像描述


File: TestFile.swift
这里扩展和视图控制器都在不同的文件中,因此testPrivateAccessLevel扩展名中无法访问私有变量.

在此输入图像描述

在此输入图像描述


这里的类ViewController2是它的子类,ViewController并且都在同一个文件中.此处私有变量testPrivateAccessLevel在子类中不可访问,但fileprivate可在子类中访问.

在此输入图像描述


Pun*_*rma 4

  1. 您不能直接在扩展内编写 if 存根。它应该写在函数内部。所以,这不是 private/fileprivate 的问题,而是你对扩展的理解的问题。将扩展视为类声明的一部分。在类中,您也只能在 func 或闭包内编写 if 存根。

  2. 即使在 Swift 3 中,扩展内的 fileprivate 变量也可以访问。所以我不明白,你的评论//accessible don't know the reason。不过,在 Swift 4 中,private 在某种意义上改变了它的含义,如果扩展与类在同一文件中定义,那么私有变量也可以在扩展内部访问。在 Swift3 中情况并非如此。

extension privateUsageExample: UITextFieldDelegate {
    func randFunc(){
        self.fPriVar = true 
        self.priVar = false
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果变量被定义为 private/fileprivate 恐怕您无法在另一个文件的扩展名中访问它们。