了解Swift-4中的访问控制

在我迅速发展的初期,我只是通过在代码中编写类,变量,属性和其他成员而感到很享受。 我不知道限制代码块,类或模块的访问。 😛基本上,那时我不关心它们,直到我看到一些怪异的关键字(“ fileprivate ”,“ internal ”等)被我的一些高级开发人员使用以及在许多GitHub开放库中使用。

访问控制可帮助您防止其他源文件和模块中的代码访问您的代码(可以是类,变量,属性和其他成员)。

您可以防止覆盖代码中声明的成员,并隐藏实现 。 您可以处理可以由哪个特定模块或文件或成员访问的代码。

swift中有不同类型的访问级别。

如果您尚未定义默认访问级别,则默认设置为“ 内部 ”。

  • 开放访问是最高(最低限制)访问级别。
    –如果将类或任何成员定义为开放,则可以从任何模块或源文件访问它。
    –您可以通过导入该模块来使用。
    –您还可以覆盖该类或类成员以及对其进行子类化。
  • Public几乎与Open类似,但是只能在定义它们的模块内进行子类化。
    –在定义模块之外可以访问公共类成员,但不能重写。

例如

  //其他模块的功能(例如您使用cocoapods或carthage安装的某些库) 
打开func dummyFunction(){
print(“我的类型是开放的,所以任何人都可以覆盖我。”)
}公共功能tempFunction(){
print(“我的类型是公开的,因此没有人可以覆盖我。”)
} //让我们在导入必要的模块之后尝试在我们的项目swift文件中覆盖此功能。 重写func dummyFunction(){} //编译器将允许 // //编译器 将给出错误,因为它是未打开的公共类型
覆盖func tempFunction(){} <- 错误.......错误......错误

其他例子:

 导入UIKit 
类MyViewController:UIViewController {
覆盖func viewDidLoad(){
super.viewDidLoad()
}
覆盖func viewWillAppear(){
super.viewWillAppear()
}
}
  • 诸如viewDidLoad,viewWillAppear之类的某些函数也使用开放式访问进行定义。 我们可以轻松地覆盖这些功能。
  • internal是默认访问级别。
  • 内部类和成员可以在定义它们的同一模块中的任何位置访问。
  A级{ 
内部变数计数器= 30
var徽章= 50
在里面() {
}
} B级:A {
让父= A()
//下一行将给我们ERROR ....... ERROR ...... ERROR
obj1.a = 40
}
  • fileprivate将使用限制为自己定义的源文件。
  • 仅当您希望在单个swift文件中使用函数/类/变量时,才可以使用此访问说明符。
// FIRST.swift 

fileprivate func getName() {
print("Members from FIRST.swift file can get access.")
}
// FIRST.swift

fileprivate func getName() {
print("Members from FIRST.swift file can get access.")
}
// SECOND.swift(different swift file)导入UIKit
类MyViewController:UIViewController {
覆盖func viewDidLoad(){
super.viewDidLoad() //下一行将给我们ERROR ....... ERROR ...... ERROR
getName()
}覆盖f​​unc viewWillAppear(){
super.viewWillAppear()
}
}
  • 私有访问是最低(最严格)的访问级别。
  • 专用访问将实体的使用限制为封闭的声明以及该声明在同一文件中的扩展名。
  • 同样从swift 4开始,可以访问同一源文件中该声明的任何扩展名。 😃

//允许

  // FIRST.swift类A { 
私人功能getName(){
}
func demoFunc(){
getName()
}
}扩展名A {
func test(){
getName()//不给出错误形式Swift 4
}
}

// 不允许

  // FIRST.swift类A {private var myName =“ iOS开发人员” 
} //错误....在封闭声明的外部使用实体
A()。myName

目前为止就这样了 。 我希望您有访问说明符的概念。

我一生中第一次写这些博客。 我正在努力为这个伟大的社区做出贡献。希望作为读者,您能从中受益。 我真的很感谢像您这样的人。下次,我将介绍另一个话题。 按照更新🙂。 随时在Linkedin上添加我。

Interesting Posts