在
swift3中,訪問權(quán)限分別有open、public、internal、fileprivate、private這幾種
在權(quán)限重寫的時候只能被縮小,不能方法
存儲屬性在任何情況下都是不能被重寫的
構(gòu)造方法只能被修飾為public,只有被public修飾的其他模塊使用才可以初始化
1. *`open`*
>`open`只能修飾`類`、`屬性`和`方法`,不能修飾`枚舉`、`結(jié)構(gòu)體`等。
被修飾后可以在任何源文件、任何模塊都可以被訪問到。
`類`可以被繼承,`屬性(計算屬性)`和`方法`可以被重寫(`override`),`存儲屬性`是不能被重寫的
2. *`public`*
>`public`可以修飾`類`、`屬性`、`方法`、`結(jié)構(gòu)體`、`枚舉`、`全局的方法`以及`全局的屬性`,可以在任何源文件、任何模塊都可以訪問到。只有在本模塊中`類`可以被繼承,`屬性(計算屬性)`和`方法`可以被重寫(`override`),`存儲屬性`是不能被重寫的
a. `MoudleA`
open class MouldeA {
public var name = "name"
open var age = "27"
public init(){}//只能修飾為public
open var getName:String{
set{
self.name = newValue
}
get{
return self.name
}
}
public func getAge() -> String{
return self.age
}
open func setAge(age:String){
self.age = age
}
}
b. 導入模塊使用
//重寫只能重寫計算屬性,方法
class SubMoudleA: MouldeA {
override init(){ //即是構(gòu)造方法被修飾為public也是可以被重寫的
super.init()
}
override var getName: String{
get{
return self.age
}
set{
self.age = newValue
}
}
//error,不可重寫public
override func getAge() -> String {
return self.name
}
override func setAge(age: String) {
self.name = age
}
}
>####*mark:*`open` vs `public`
`open`修飾的類或方法可以被其他模塊子類化或者被重寫,而`public`不行,只能在本模塊被子類化或方法被重寫
3. *`internal`*
>`internal`修飾的類、屬性、方法、枚舉、結(jié)構(gòu)體等,只允許在本模塊內(nèi)任意訪問、子類化及重寫
4. *`fileprivate`*
>見名知意,就是縮小版的`internal`,將模塊范圍縮小到文件范圍
5. *`private`*
>再次縮小,縮小到定義范圍內(nèi)使用(和java的private控制相同)
6. *`默認權(quán)限`*
>1. 在未聲明權(quán)限的控制的情況下,`類`、`屬性`、`方法`、`結(jié)構(gòu)體`、`枚舉`、`全局的方法`以及`全局的屬性`的默認權(quán)限為`internal`
>2. 以`internal`為分界線,如果外部權(quán)限大于這個權(quán)限,內(nèi)部權(quán)限默認就是`internal`。如果外部權(quán)限低于`internal`,那么內(nèi)部權(quán)限默認和外部權(quán)限相同。
//這里的說法是不嚴謹?shù)?,還要依托于屬性類的權(quán)限,以及元祖的權(quán)限,由內(nèi)部最低權(quán)限決定,還有方法的參數(shù)和返回值,這些情況下的各種考量決定著默認權(quán)限,
`權(quán)限范圍`:參考下面的權(quán)限范圍
`外部權(quán)限`:想像成類的權(quán)限(這只是模擬一種場景,絕不僅僅于此)
`內(nèi)部權(quán)限`:類內(nèi)部屬性和方法的權(quán)限,(所以在顯示聲明內(nèi)部權(quán)限高于外部權(quán)限是沒有意義的,雖然不會報錯(xcode8.1))
#####總結(jié):權(quán)限范圍
>`open`>`public`>`internal`>`fileprivate` > `private`
###其他
a. 屬性(變量)
>最終權(quán)限不能大于屬性類本身的權(quán)限,也是必須*`顯示聲明`*
fileprivate class A {} //屬性類的權(quán)限是文件范圍
//right
fileprivate class B{
public var a = A()//雖然顯示聲明為fileprivate,從上可知道,
//其最終權(quán)限還是fileprivate,所以不會報錯(xcode8.1)并不保證以后不會報錯
}
//wrong
public class C{
public var a = A()//超過了屬性類的權(quán)限,報錯
}
//wrong
public class D{
var a = A()//超過了屬性類的權(quán)限,報錯
}
//wrong
public var c = A()//超過了屬性類的權(quán)限,報錯
b. 元祖
>元祖的權(quán)限,有內(nèi)部成員的最小控制權(quán)限,必須*`顯示聲明`*,并且不能比最小權(quán)限大
class A {}
fileprivate class B{
public var a = A()
}
fileprivate var a:(A,B)? //right
private var b:(A,B)? //right
c. 方法
>方法的權(quán)限,由參數(shù)和返回值的權(quán)限控制
也是必須*`顯示聲明`*
fileprivate class B{}
class A {
fileprivate func helloB(b:B){
print("bbbb")
}
}
fileprivate func helloB(b:B){
print("bbbb")
}
####總結(jié)其他
>由上面推導出的最終權(quán)限,如果大于其他里面的權(quán)限,必須*`顯示聲明`*為其他權(quán)限(或小于)
`其他權(quán)限`:指的是上面*其他*里面那幾種情況