Swift的訪問控制講解


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之后的訪問修飾符的,希望對大家有所幫助

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM