Swift語(yǔ)言可以實(shí)現(xiàn)封裝,由于在Swift中類、結(jié)構(gòu)體和枚舉類型都具有面向?qū)ο蟮奶匦裕虼薙wift的封裝就變得比較復(fù)雜了
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)建寧免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
一、訪問(wèn)范圍
訪問(wèn)范圍主要有2個(gè):模塊和源文件
1、關(guān)于模塊
模塊是指一個(gè)應(yīng)用程序包成一個(gè)框架,在Swift中,可以使用import關(guān)鍵字引入模塊到自己的工程中
應(yīng)用程序包指一個(gè)可執(zhí)行的應(yīng)用程序包,其內(nèi)部包含了很多swift文件以及其他一些文件,
框架也是很多switf文件以及其他一些文件的集合,但與應(yīng)用程序包不同的是,它編譯的結(jié)果是不可執(zhí)行程序
2、源文件
源文件指的是swift種的.swift文件,它編譯之后被包含在應(yīng)用程序包或框架中,通常一個(gè)源文件包含一個(gè)面向?qū)ο箢愋停?、結(jié)構(gòu)體和枚舉),在這些函數(shù)中包含函數(shù)、屬性等
二、訪問(wèn)級(jí)別
Swift提供了3種不同的訪問(wèn)級(jí)別,有這些修飾符:public,private,internal,這些訪問(wèn)修飾符可以修飾類、結(jié)構(gòu)體、嵌套等面向?qū)ο箢愋?,還可以修飾:變量,常量、下標(biāo)、元組、函數(shù)、屬性等內(nèi)容
1、public 可以訪問(wèn)自己類中的任何public實(shí)體,如果使用import引入其他模塊,可以訪問(wèn)其它模塊的public實(shí)體
2、internal 只能訪問(wèn)自己模塊的internal實(shí)體,不能訪問(wèn)其他模塊的internal實(shí)體,internal可以省略,缺省訪問(wèn)限定是internal
3、private 只能在當(dāng)前源文件中使用的實(shí)體,成為私有實(shí)體,使用private修飾符,可以用作隱藏某些功能的實(shí)現(xiàn)細(xì)節(jié)。
三、使用訪問(wèn)限制最佳實(shí)踐
1、統(tǒng)一性原則
(1)原則1:如果一個(gè)類型(類、結(jié)構(gòu)體和枚舉)定義為internal或private,那么類型聲明的變量或常量不能使用public訪問(wèn)級(jí)別,因?yàn)閜ublic的變量或常量允許任何人訪問(wèn),而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() //編譯錯(cuò)誤 public var dept = Department() //編譯錯(cuò)誤
(2)原則2:函數(shù)的訪問(wèn)級(jí)別不能高于它的參數(shù)和返回類型的訪問(wèn)級(jí)別,假設(shè)函數(shù)聲明為public,而參數(shù)或返回值聲明為internal或private,則會(huì)出現(xiàn)函數(shù)可以被任何人訪問(wèn),但是它的參數(shù)和返回類型不可以的矛盾情況
示例:
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 } 上述代碼會(huì)發(fā)生編譯錯(cuò)誤,說(shuō)明了getEmpDept的函數(shù)的訪問(wèn)級(jí)別高于Employee類型的訪問(wèn)級(jí)別
2、設(shè)計(jì)原則
如果編寫的是應(yīng)用程序,應(yīng)用程序包中的所有Swift文件和其中定義的實(shí)體,都是給本應(yīng)用使用的,而不是提供給其他模塊使用,那么就不用設(shè)置訪問(wèn)級(jí)別,也就是默認(rèn)的訪問(wèn)級(jí)別。
如果開(kāi)發(fā)的是框架,框架編譯的文件不能獨(dú)立運(yùn)行,因此它是給別人使用的,這種情況下我們就要詳細(xì)設(shè)計(jì)其中的swift文件和實(shí)體的訪問(wèn)級(jí)別,其中讓別人使用的設(shè)計(jì)為public,不想讓別人看到的可以設(shè)計(jì)為internal或private
3、元組類型的訪問(wèn)級(jí)別
元組類型的訪問(wèn)級(jí)別是遵循它元組中的字段最低級(jí)的訪問(wèn)級(jí)別,示例如下:
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、枚舉類型的訪問(wèn)級(jí)別
枚舉中成員的訪問(wèn)級(jí)別繼承自該枚舉,我們不能為枚舉中的成員指定訪問(wèn)級(jí)別,如下所示
public enum WeekDays{ case Monday case Tuesday case Wednesday case Thursday case Friday }
WeekDays的訪問(wèn)級(jí)別是public,那么它的成員的訪問(wèn)級(jí)別也為public