訪問控制權(quán)限 in swift3

swift3中,訪問權(quán)限分別有openpublic、internalfileprivate、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)限`:指的是上面*其他*里面那幾種情況
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評論 19 139
  • 【Swift 3.1】24 -訪問權(quán)限 (Access Control) 自從蘋果2014年發(fā)布Swift,到現(xiàn)在...
    Lebron_James閱讀 2,299評論 5 1
  • 文/司徒林夏 租住在Petersfield小鎮(zhèn)73號時,有天晚上大暴雨,一直下到半夜屋外一聲脆裂的響聲。第二天看到...
    司徒林夏閱讀 406評論 0 0
  • 由于本人論文還沒發(fā)布,不變透露,因此具體內(nèi)容都引用自蘇帆帆. 移動閱讀業(yè)務(wù)持續(xù)使用行為影響因素研究[D]. 北京郵...
    陌紫豐田閱讀 3,281評論 1 9
  • 細雪輕語落天籟,草木街巷素冠帶。冬月風寒飄紗絮,梨花悄然一地白。 (部分網(wǎng)圖)
    介山散人閱讀 356評論 0 0

友情鏈接更多精彩內(nèi)容