Access control restricts access to parts of your code from code in other source files and modules. This feature enables you to hide the implementation details of your code, and to specify a preferred interface through which that code can be accessed and used.
访问控制用来限制你的代码是否可以访问其他源文件或模块的代码。
目的是方便隐藏代码细节,并提供外部使用。(包括类、结构体、枚举、变量、方法、代理等。)
访问权限(least -> most restrictive)
依次为open,public,internal,fileprivate,private。
1. Open Public (最宽松)
这两个修饰符在同一个模块中都可以随意访问。不同之处如下:
open 可以被其他 module 引用
//module 1
public func A(){}
open func B(){}
//module 2
override func A(){} // error
override func B(){} // success
2. Internal(默认)
Swift 默认的属性和方法在同一个 module 中都可以访问。
但如果是框架或库代码,即使 import 对应的头文件,仍然是不可以引用。
如下:
我们在UIKit module 中定义了一个方法
internal func internalMethod() {
print("I am inside UIKit")
}
即使引用了 UIKit,仍然是无法调用该方法的,只能在UIKit内部使用。
3. Fileprivate Private
所修饰的方法都可以在当前类中访问。
区别
fileprivate 在当前文件中都可以访问。
private 区分一下 Swift 版本:
Swift 3 中只能在当前类里面访问,在当前类的extension中都是不可以访问的。
Swift 4 中可以在当前类的 extension 中访问了。
但是 fileprivate 和 private 还是有区别的,如下:
class A: NSObject {
private var isPrivate: Bool?
fileprivate var isFileprivate: Bool?
}
class B: NSObject {
func SomeFunction() {
let a = A()
a.isFileprivate = true
a.isPrivate = true // 'isPrivate' is inaccessible due to 'private' protection level
}
}
这是在同一个文件内,fileprivate 是可以正常访问。
但是类不同,所以 private 是不能访问的。
(正常也不会这么写。。。)
以上就是目前版本 Swift 4.0 访问控制内容的简单整理。
ღ( ´・ᴗ・` )比心
Source:Swift-Access Control