您好,登錄后才能下訂單哦!
Swift語言可以實現封裝,由于在Swift中類、結構體和枚舉類型都具有面向對象的特性,因此Swift的封裝就變得比較復雜了
一、訪問范圍
訪問范圍主要有2個:模塊和源文件
1、關于模塊
模塊是指一個應用程序包成一個框架,在Swift中,可以使用import關鍵字引入模塊到自己的工程中
應用程序包指一個可執行的應用程序包,其內部包含了很多swift文件以及其他一些文件,
框架也是很多switf文件以及其他一些文件的集合,但與應用程序包不同的是,它編譯的結果是不可執行程序
2、源文件
源文件指的是swift種的.swift文件,它編譯之后被包含在應用程序包或框架中,通常一個源文件包含一個面向對象類型(類、結構體和枚舉),在這些函數中包含函數、屬性等
二、訪問級別
Swift提供了3種不同的訪問級別,有這些修飾符:public,private,internal,這些訪問修飾符可以修飾類、結構體、嵌套等面向對象類型,還可以修飾:變量,常量、下標、元組、函數、屬性等內容
1、public 可以訪問自己類中的任何public實體,如果使用import引入其他模塊,可以訪問其它模塊的public實體
2、internal 只能訪問自己模塊的internal實體,不能訪問其他模塊的internal實體,internal可以省略,缺省訪問限定是internal
3、private 只能在當前源文件中使用的實體,成為私有實體,使用private修飾符,可以用作隱藏某些功能的實現細節。
三、使用訪問限制最佳實踐
1、統一性原則
(1)原則1:如果一個類型(類、結構體和枚舉)定義為internal或private,那么類型聲明的變量或常量不能使用public訪問級別,因為public的變量或常量允許任何人訪問,而private或internal的類型不允許
private class Employee { var no:Int = 0 var name:String = "" var job:String? var salary:Double var dept:Department? } internal struct Department { var no: Int = 0 var name:String ="" } public let emp = Employee() //編譯錯誤 public var dept = Department() //編譯錯誤
(2)原則2:函數的訪問級別不能高于它的參數和返回類型的訪問級別,假設函數聲明為public,而參數或返回值聲明為internal或private,則會出現函數可以被任何人訪問,但是它的參數和返回類型不可以的矛盾情況
示例:
class Employee { var no:Int = 0 var name:String = "" var job:String? var salary:Double var dept:Department? } struct Department { var no: Int = 0 var name:String ="" } public func getEmpDept(emp:Employee)->Department? { return emp.dept } 上述代碼會發生編譯錯誤,說明了getEmpDept的函數的訪問級別高于Employee類型的訪問級別
2、設計原則
如果編寫的是應用程序,應用程序包中的所有Swift文件和其中定義的實體,都是給本應用使用的,而不是提供給其他模塊使用,那么就不用設置訪問級別,也就是默認的訪問級別。
如果開發的是框架,框架編譯的文件不能獨立運行,因此它是給別人使用的,這種情況下我們就要詳細設計其中的swift文件和實體的訪問級別,其中讓別人使用的設計為public,不想讓別人看到的可以設計為internal或private
3、元組類型的訪問級別
元組類型的訪問級別是遵循它元組中的字段最低級的訪問級別,示例如下:
private class Employee { var no:Int = 0 var name:String = "" var job:String? var salary:Double var dept:Department? } struct Department { var no: Int = 0 var name:String ="" } public func getEmpDept(emp:Employee)->Department? { return emp.dept } private let emp = Employee() var dept = Department() private var student1 = (dept,emp)
4、枚舉類型的訪問級別
枚舉中成員的訪問級別繼承自該枚舉,我們不能為枚舉中的成員指定訪問級別,如下所示
public enum WeekDays{ case Monday case Tuesday case Wednesday case Thursday case Friday }
WeekDays的訪問級別是public,那么它的成員的訪問級別也為public
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。