使用swift 4访问扩展和另一个类中的fileprivate和private变量

Posted

技术标签:

【中文标题】使用swift 4访问扩展和另一个类中的fileprivate和private变量【英文标题】:Accessing fileprivate and private variables in extension and another class using swift 4 【发布时间】:2018-04-12 12:51:11 【问题描述】:

我一直在浏览最近的 swift 文档,并研究了几个例子来理解 swift4 中的 private 和 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(文件私有)变量,以及在不同文件中子类化该类的另一个类中。

【问题讨论】:

【参考方案1】:

在 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可以在扩展中访问

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

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

TLDR:现在无法为类定义属性/函数privatefileprivate,然后在不同文件 中从该类的扩展访问它。访问级别private 定义的属性/函数可在同一类中定义的所有类和扩展中访问,但不能在子类中访问。访问级别fileprivate 定义的属性/函数可供类的扩展、该类的子类访问。

【讨论】:

【参考方案2】:

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

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

extension privateUsageExample: UITextFieldDelegate 
    func randFunc()
        self.fPriVar = true 
        self.priVar = false
    

    如果一个变量被定义为私有/文件私有,恐怕你不能在另一个文件的扩展中访问它们。

【讨论】:

感谢您的回复。你已经清除了我的大部分疑虑,但我没有得到关于在我的问题(我的问题的最后一课)中询问的类的子类中访问 private/fileprivate 变量的答案 @ashwin:正如我所提到的,这是不可能的。如果您希望从另一个文件访问这些变量,则必须删除 fileprivate/private。

以上是关于使用swift 4访问扩展和另一个类中的fileprivate和private变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的swift文件访问一个类中的所有对象

Swift 4 中的私有和文件私有有啥区别

Swift无法使用类型(实例)访问类中的静态变量

在组合项目中从Swift类访问Objective-C类中的singleton sharedInstance

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类