Swift - 访问控制(fileprivate,private,internal,public,open)
在 Swift 语言中,访问修饰符有五种,分别为 fileprivate,private,internal,public 和 open。
其中 fileprivate 和 open 是 Swift 3 新添加的。由于过去 Swift 对于访问权限的控制,不是基于类的,而是基于文件的。这样会有问题,所以 Swift 3 新增了两个修饰符对原来的 private、public 进行细分。
一、各个修饰符区别
1,private
private 访问级别所修饰的属性或者方法只能在当前类里访问。
(注意:Swift4 中,extension 里也可以访问 private 的属性。)
2,fileprivate
fileprivate 访问级别所修饰的属性或者方法在当前的 Swift 源文件里可以访问。(比如上面样例把 private 改成 fileprivate 就不会报错了)
3,internal(默认访问级别,internal修饰符可写可不写)
-
internal 访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
-
如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
-
如果是 App 代码,也是在整个 App 代码,也是在整个 App 内部可以访问。
4,public
可以被任何人访问。但其他 module 中不可以被 override 和继承,而在 module 内可以被 override 和继承。
5,open
可以被任何人使用,包括 override 和继承。
二、5种修饰符访问权限排序
从高到低排序如下:
| 1 | open > public > interal > fileprivate > private**** |
原文出自:www.hangge.com 转载请保留原文链接:www.hangge.com/blog/cache/…
9.Swift - class与staitc关键字的区别与使用(类方法、静态方法)
一、static 关键字
1,结构体 struct 和枚举 enum 的静态属性,静态方法使用 static 关键字
| 12345678910 | struct Account { var amount : Double = 0.0 //账户金额 var owner : String = "" //账户名 static var interestRate : Double = 0.668 //利率 static func interestBy(amount : Double) -> Double { return interestRate * amount }} |
2,类 Class 的静态属性,静态方法也可以使用 static 关键字
| 12345678910 | class Account { var amount : Double = 0.0 //账户金额 var owner : String = "" //账户名 static var interestRate : Double = 0.668 //利率 static func interestBy(amount : Double) -> Double { return interestRate * amount }} |
二、class 关键字
class 关键字专门用在 class 类型的上下文中的,可以用来修饰类方法以及类的计算属性(注意:不能用在存储类属性上)。
| 123456789101112131415 | class Account { var amount : Double = 0.0 // 账户金额 var owner : String = "" // 账户名 class var staticProp : Double { return 0.668 } class func interestBy(amount : Double) -> Double { return 0.8886 * amount }} //访问类计算属性 print(Account.staticProp) |
三、static 与 class 的区别
-
static 可以在类、结构体、或者枚举中使用。而 class 只能在类中使用。
-
static 可以修饰存储属性,static 修饰的存储属性称为静态变量(常量)。而 class 不能修饰存储属性。
-
static 修饰的计算属性不能被重写。而 class 修饰的可以被重写。
-
static 修饰的静态方法不能被重写。而 class 修饰的类方法可以被重写。
-
class 修饰的计算属性被重写时,可以使用 static 让其变为静态属性。
-
class 修饰的类方法被重写时,可以使用 static 让方法变为静态方法。
原文出自:www.hangge.com 转载请保留原文链接:www.hangge.com/blog/cache/…
8.Swift - 属性观察者(willSet与didSet)
属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点:
1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet。
2,给属性添加观察者必须要声明清楚属性类型,否则编译器报错。
3,willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue。
4,didSet可以带一个oldName的参数,表示旧的属性,不带的话默认命名为oldValue。
5,属性初始化时,willSet和didSet不会调用。只有在初始化上下文之外,当设置属性值时才会调用。
6,即使是设置的值和原来值相同,willSet和didSet也会被调用
示例如下:
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | class People{ //普通属性 var firstName:String = "" var lastName:String = "" var nickName:String = "" //计算属性 var fullName:String { get**** { return nickName + " " + firstName + " " + lastName } } //带属性监视器的普通属性 var age:Int = 0 { //我们需要在age属性变化前做点什么 willSet**** { print("Will set an new value (newValue) to age") } //我们需要在age属性发生变化后,更新一下nickName这个属性 didSet**** { print("age filed changed form (oldValue) to (age)") if age<10 { nickName = "Little" }else**** { nickName = "Big" } } } func toString() -> String { return "Full Name: (fullName) " + ", Age: (age) " } } let me = People()me.firstName = "Li"me.lastName = "Lei"me.age = 30 print(me.toString()) /程序输出Will set an new value 30 to ageage filed changed form 0 to 30Full Name: Big Li Lei , Age: 30/ |
原文出自:www.hangge.com 转载请保留原文链接:www.hangge.com/blog/cache/…
7.Swift - 类初始化和反初始化方法(init与deinit)
1,init():类的初始化方法(构造方法)
| /使用默认构造函数/class Student{ //类属性 var name:String = "" var number:Int = 0}var student = Student() /自定义构造函数/class Person{ //类属性 var name:String var age:Int //类构造函数 init(newName:String, newAge:Int){ self.name = newName self.age = newAge } //成员函数(实例方法) func say() -> String{ return "我叫(name)" }}var p = Person(newName: "hangge",newAge: 32)print(p.say()) |
2,deinit():类反初始化方法(析构方法)
| 1234567891011 | class DBClass{ var conn:Connection? = Connection() deinit{ //可以做一些清理工作 self.conn!.close() self.conn = nil**** }} var db:DBClass? = DBClass()db = nil //设置nil后即可执行deinit()方法 |
3.运算符重载和运算符函数
让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为运算符重载。
1,通过重载加号运算符,使自定义的两个坐标结构体对象实现相加:
| 1234567891011 | struct CenterPointer{ var x=0, y=0} func + (left:CenterPointer, right:CenterPointer) -> CenterPointer{ return CenterPointer(x:left.x+right.x, y:left.y+right.y)} let pointer1 = CenterPointer(x:2, y:3)let pointer2 = CenterPointer(x:4, y:5)let pointer3 = pointer1 + pointer2 |
2,重载判断运算符,实现判断自定义类型是否相等
| 1234567 | func == (left:CenterPointer, right:CenterPointer) -> Bool { return (left.x == right.x) && (left.y == right.y)} func != (left:CenterPointer, right:CenterPointer) -> Bool { return !(left == right)} |
3,组合运算符,即将其他运算符和赋值运算符组合在一起,注意要把运算符左参数设置成inout类型
| 1234567 | func += (left:inout CenterPointer, right:CenterPointer){ left = left + right} var pointer1 = CenterPointer(x:2, y:3)var pointer2 = CenterPointer(x:4, y:5)pointer1 += pointer2 |
原文出自:www.hangge.com 转载请保留原文链接:www.hangge.com/blog/cache/…