fileprivate是swift3.0中新添加的属性,表示文件私有,即只能同一文件中访问,不同文件中不能访问;
一、fileprivate修饰的,不能被其他文件访问,只能被所在的文件访问,包括属性、方法、类、结构体、枚举、全局变量等
// in FileprivateClass.swift
// fileprivate修饰的全局变量,只能被本本文件访问
fileprivate let kFileprivateCont: Int = 10
class FilePrivateClass {
// fileprivate修饰的属性只能在本文件中本访问
fileprivate var fileprivateProperty : String?
var internalProperty: String?
// fileprivate修饰的方法只能在本文件中本访问
fileprivate func fileprivateMethod() {
print("该方法不能被其他文件访问到")
}
}
// in main.swift
var filePrivateObj = FilePrivateClass()
filePrivateObj.internalProperty = "能正常设置值,因为是internal访问权限"
// 下面这段代码不能正常通过编译
filePrivateObj.fileprivateProperty = "通不过编译,不能访问其他文件中的fileprivate属性"
filePrivateObj.fileprivateMethod() // 通不过编译,不能访问其他文件中的fileprivate修饰的方法
print(kFileprivateCont) // 通不过编译,不能其他文件中的fileprivate修饰的常量
如果把FileprivateClass.swift内容放到main.swift中,将能通过编译:
// fileprivate修饰的全局变量,只能被本本文件访问
fileprivate let kFileprivateCont: Int = 10
class FilePrivateClass {
// fileprivate修饰的属性只能在本文件中本访问
fileprivate var fileprivateProperty : String?
var internalProperty: String?
// fileprivate修饰的方法只能在本文件中本访问
fileprivate func fileprivateMethod() {
print("该方法不能被其他文件访问到")
}
}
var filePrivateObj = FilePrivateClass()
filePrivateObj.internalProperty = "能正常设置值,因为是internal访问权限"
// 下面这段代码能正常通过编译
filePrivateObj.fileprivateProperty = "编译通过"
filePrivateObj.fileprivateMethod() // 编译通过
print(kFileprivateCont) // 编译通过
二、fileprivate修饰的类、结构、枚举等,生成的实例对象也只能被本文件访问
fileprivate class FilePrivateClass {}
// 编译出错,filePrivateObj默认可以被别的文件访问,需fileprivate修饰
// let filePrivateObj = FilePrivateClass()
// 编译通过,fileprivate修饰的类,生成的实例也只能被本文件访问
fileprivate let filePrivateObj = FilePrivateClass()
上面的例子中,filePrivateObj默认是能被其他文件访问的,所以需要fileprivate修饰,确保filePrivateObj只能被本文件访问;
再举个例子:
fileprivate class FilePrivateClass {}
class MyClass {
// fileprivateProperty属性默认能被其他文件访问,所以需要fileprivate修饰
fileprivate var fileprivateProperty: FilePrivateClass?
}
或者这么写:
fileprivate class FilePrivateClass {}
// 使用 fileprivate修饰 MyClass
fileprivate class MyClass {
// 可以不用加fileprivate,因为MyClass已经被fileprivate修饰了,fileprivateProperty属性不能被其他文件访问
var fileprivateProperty: FilePrivateClass?
}
三、总结一下:被fileprivate修饰后,只能被本文件访问