热门搜索 :
考研考公
您的当前位置:首页正文

Swift3.0访问控制(二)fileprivate

来源:东饰资讯网

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修饰后,只能被本文件访问

Top