Swift的訪問控制講解

國孩發表於2019-07-01

Swift中訪問修飾符總共有5種,分別為fileprivate,private,internal,public和open,其中,fileprivate以及open是Swift 3新新增的.因為過去的Swift對於訪問許可權的控制,不是基於類的,而是基於檔案的,這樣會有問題,所以在Swift 3中增加了兩個對原本的private,public進行細分.

1.private與fileprivate

fileprivate是在Swift 3之後新增的,將原本的private進行細分

在引入Swift 3之前,private關鍵字將實體的使用限制在定義它的原始檔中.如下:

import UIKit

class NotesViewController: UIViewController {
    private var dataSource = [String]()
}

extension NotesViewController: UITableViewDataSource {

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }
    ...
}

我們宣告一個UIViewController子類NoteViewController,子類並帶有私有屬性dataSource.在同個原始檔中,我們為NotesViewController類建立一個擴充套件,遵守UITableViewDataSource協議,也可訪問到私有屬性private修飾的.

上面的程式碼是Swift3之前,如果將上述程式碼移植到Swift 3,編譯器會報錯,會提示dataSource屬性是一個未解析的識別符號.換句話說,dataSource屬性宣告為private,副檔名中是不可以訪問的.

 

Swift 3以後,private為私有的實體只能在宣告的範圍內被訪問.而fileprivate可以在擴充檔案中訪問.

import UIKit

class NotesViewController: UIViewController {
    fileprivate var dataSource = [String]()
}

extension NotesViewController: UITableViewDataSource {

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }
    ...
}

 

2.internal修飾符

internal訪問許可權在模組內部可以訪問到,超出模組內部就不可被訪問了,Swift中預設就是internal的訪問許可權.

 

3.public與open

Swift 3之前 public可以用來修飾class或者class成員方法,成員屬性等.Swift 3新增了open訪問控制關鍵字.

修飾class的public和open區別:

public修飾的class允許外部模組呼叫,但是不允許繼承,而open修飾的class即允許其他模組呼叫,也允許被子類繼承

修復class成員的public和open區別:

public修飾的成員允許其他模組呼叫,但不能被覆蓋(override),而open修飾的成員既允許被其他模組呼叫,也可以被子類覆蓋

 

open使用注意:


1.如果class宣告為public,那麼class的成員變數就不可以宣告為open,因為public class已被限定為不可繼承

public class NonSubclassableParentClass {
        public func foo() {}
        //非法宣告
        open func bar() {}
        public final func baz() {}
    }

 

2.其他模組繼承父類的成員時,也需要把成員宣告為open

open class SubclassableParentClass {
        public func foo() {}
        open func bar() {}
        public final func baz() {}
    }

    open class SubclassC : SubclassableParentClass {
        //非法,成員沒有被宣告為open
        override func bar() { } 
    }

以上就是Swift 3之後的訪問修飾符的,希望對大家有所幫助

 

相關文章