訪問控制權限 in swift3

swift3中,訪問權限分別有openpublicinternalfileprivateprivate這幾種

權限重寫的時候只能被縮小,不能方法
存儲屬性在任何情況下都是不能被重寫的
構造方法只能被修飾為public,只有被public修飾的其他模塊使用才可以初始化


1. *`open`*
>`open`只能修飾`類`、`屬性`和`方法`,不能修飾`枚舉`、`結構體`等。
被修飾后可以在任何源文件、任何模塊都可以被訪問到。
`類`可以被繼承,`屬性(計算屬性)`和`方法`可以被重寫(`override`),`存儲屬性`是不能被重寫的
2. *`public`*
>`public`可以修飾`類`、`屬性`、`方法`、`結構體`、`枚舉`、`全局的方法`以及`全局的屬性`,可以在任何源文件、任何模塊都可以訪問到。只有在本模塊中`類`可以被繼承,`屬性(計算屬性)`和`方法`可以被重寫(`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(){ //即是構造方法被修飾為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`修飾的類、屬性、方法、枚舉、結構體等,只允許在本模塊內任意訪問、子類化及重寫

4. *`fileprivate`*
    >見名知意,就是縮小版的`internal`,將模塊范圍縮小到文件范圍

5. *`private`*
    >再次縮小,縮小到定義范圍內使用(和java的private控制相同)

6. *`默認權限`*
>1. 在未聲明權限的控制的情況下,`類`、`屬性`、`方法`、`結構體`、`枚舉`、`全局的方法`以及`全局的屬性`的默認權限為`internal`
>2. 以`internal`為分界線,如果外部權限大于這個權限,內部權限默認就是`internal`。如果外部權限低于`internal`,那么內部權限默認和外部權限相同。
//這里的說法是不嚴謹的,還要依托于屬性類的權限,以及元祖的權限,由內部最低權限決定,還有方法的參數和返回值,這些情況下的各種考量決定著默認權限,
`權限范圍`:參考下面的權限范圍
`外部權限`:想像成類的權限(這只是模擬一種場景,絕不僅僅于此)
`內部權限`:類內部屬性和方法的權限,(所以在顯示聲明內部權限高于外部權限是沒有意義的,雖然不會報錯(xcode8.1))

#####總結:權限范圍
>`open`>`public`>`internal`>`fileprivate` > `private`

###其他
a. 屬性(變量)
>最終權限不能大于屬性類本身的權限,也是必須*`顯示聲明`*

fileprivate class A {} //屬性類的權限是文件范圍
//right
fileprivate class B{
public var a = A()//雖然顯示聲明為fileprivate,從上可知道,
//其最終權限還是fileprivate,所以不會報錯(xcode8.1)并不保證以后不會報錯
}
//wrong
public class C{
public var a = A()//超過了屬性類的權限,報錯
}
//wrong
public class D{
var a = A()//超過了屬性類的權限,報錯
}
//wrong
public var c = A()//超過了屬性類的權限,報錯


b. 元祖
>元祖的權限,有內部成員的最小控制權限,必須*`顯示聲明`*,并且不能比最小權限大

class A {}
fileprivate class B{
public var a = A()
}
fileprivate var a:(A,B)? //right
private var b:(A,B)? //right


c. 方法
 >方法的權限,由參數和返回值的權限控制
也是必須*`顯示聲明`*

fileprivate class B{}
class A {
fileprivate func helloB(b:B){
print("bbbb")
}
}
fileprivate func helloB(b:B){
print("bbbb")
}


####總結其他
>由上面推導出的最終權限,如果大于其他里面的權限,必須*`顯示聲明`*為其他權限(或小于)
`其他權限`:指的是上面*其他*里面那幾種情況
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容