我一直在浏览最近的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)变量,并在另一个类中为不同文件中的类创建子类。
答案 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
可以在扩展名
文件: TestFile.swift
这里的扩展和视图控制器都在不同的文件中,因此扩展名中无法访问私有变量testPrivateAccessLevel
。
这里,类ViewController2
是ViewController
的子类,两者都在同一个文件中。此处私有变量testPrivateAccessLevel
在子类中不可访问,但fileprivate可在子类中访问。
答案 1 :(得分:3)
您无法直接在扩展中写入存根。它意味着写在函数内部。因此,这不是private / fileprivate的问题,而是您对扩展的理解。将扩展视为类声明的一部分。在类中,您只能在func或闭包内写入存根。
扩展程序中的fileprivate变量即使在Swift 3中也可以访问。所以我不理解你的评论//accessible don't know the reason
。虽然,在Swift 4中,private在某种意义上改变了它的含义,如果扩展名是在与类相同的文件中定义的,那么私有变量也可以在扩展中访问。在Swift3中不是这样。
extension privateUsageExample: UITextFieldDelegate { func randFunc(){ self.fPriVar = true self.priVar = false } }