使用swift 4

时间:2017-10-31 11:09:47

标签: ios swift swift4 access-control access-specifier

我一直在浏览最近的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)

 }

请你帮助我在同一个文件中的同一个类的扩展中访问priVar(私有)和fPriVar(fileprivate)变量,并在另一个类中为不同文件中的类创建子类。

2 个答案:

答案 0 :(得分:13)

在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可以在扩展名

中访问

enter image description here


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

enter image description here

enter image description here


这里,类ViewController2ViewController的子类,两者都在同一个文件中。此处私有变量testPrivateAccessLevel在子类中不可访问,但fileprivate可在子类中访问。

enter image description here

答案 1 :(得分:3)

  1. 您无法直接在扩展中写入存根。它意味着写在函数内部。因此,这不是private / fileprivate的问题,而是您对扩展的理解。将扩展视为类声明的一部分。在类中,您只能在func或闭包内写入存根。

  2. 扩展程序中的fileprivate变量即使在Swift 3中也可以访问。所以我不理解你的评论//accessible don't know the reason。虽然,在Swift 4中,private在某种意义上改变了它的含义,如果扩展名是在与类相同的文件中定义的,那么私有变量也可以在扩展中访问。在Swift3中不是这样。

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