网上看了许多关于修饰符fileprivate,private的使用,结论后面说,下面是我测试的结果
注:
fileprivate(文件私有) 是 swift3.0引入的
测试:xcode Version 8.3.3 / swift3.1
- 研究
- 1、private / fileprivate / private(set)
- 2、private修饰后 extension中无法赋值
创建两个类 分别为:
FirstDog.swift
SecondDog.swift
代码:
//FirstDog.swift
class FirstDog: NSObject {
//name属性
//不加任何修饰 本类和其他类都可以访问dogName
var dogName : String = "fitstDog"
//private绝对私有,其他类中不能访问,本类的extension中也不能访问,子类继承父类也不能访问
// error:'dogName' is inaccessible due to 'private' protection level
private var dogName : String = "fitstDog"
//fileprivate是文件私有,一个文件是可以有多个类的,标记为fileprivate的常理在多个类里面都可以用。
//换句话说,在当前FirstDog类 文件中 都可以使用,换成其他类不能使用,继承也不能使用
//'dogName' is inaccessible due to 'fileprivate' protection level
fileprivate var dogName : String = "fitstDog"
//这个写法就是set方法私有
//extension、继承、其他类,赋值dogName的操作都会报错
//error:Cannot assign to property: 'dogName' setter is inaccessible
private(set) var dogName : String = "fitstDog"
func temp1() {
//不加任何修饰 本类、其他类、extension中 都可以访问dogName
dogName = "fitstCat"
}
}
//本类的 extension
extension FirstDog {
func temp2() {
//修改
dogName = "fitstCat"
print(dogName)
}
}
//FirstDog.swift
// 本类FirstDog文件中的 另一个类ThirdDog
// fileprivate是文件私有,一个文件是可以有多个类的,标记为fileprivate的常理在多个类里面都可以用,但如果标记为private,在不同类是不能访问的。
class ThirdDog: NSObject {
let fitstDog = FirstDog()
func temp3() {
//修改
fitstDog.dogName = "thirdDog"
print(fitstDog.dogName)
}
}
//FirstDog.swift
// 本类FirstDog文件中的 另一个类FourthDog 继承FirstDog
//继承父类FirstDog 如果属性dogName设置为private 子类FourthDog是不能访问的
class FourthDog: FirstDog {
let fitstDog = FirstDog()
func temp4() {
//修改
fitstDog.dogName = "thirdDog"
print(fitstDog.dogName)
}
}
SecondDog.swift
import UIKit
class SecondDog: NSObject {
let firstDog = FirstDog()
func temp() {
print(firstDog.dogName)
firstDog.dogName = "secondDog"
}
}
ps:你也可以创建两个类,复制上面的代码,打开关闭 // 上面的dogName属性 尝试下
总结:
private私有,本类的extension、其他类、继承都不能使用
fileprivate文件私有,本类文件内可以使用,文件外其他类、继承都不能使用
private(set) set方法私有,不能修改
参考:
http://www.jianshu.com/p/604305a61e57
http://www.jianshu.com/p/39853abd9f95
网友评论