Swift Access Control訪問(wèn)控制與斷言詳細(xì)介紹
訪問(wèn)控制(Access Control)
1、在訪問(wèn)權(quán)限控制這塊,Swift提供了5個(gè)不同的訪問(wèn)級(jí)別(以下是從高到低排序,實(shí)體指被訪問(wèn)級(jí)別修飾的內(nèi)容)
- open:允許在定義實(shí)體的模塊、其他模塊中訪問(wèn),允許其他莫模塊進(jìn)行繼承、重寫(xiě)(open只能用在類(lèi)、類(lèi)成員上)
- public:允許在定義實(shí)體的模塊、其他模塊中訪問(wèn),不允許其他模塊進(jìn)行繼承、重寫(xiě)
- internal:只允許在定義實(shí)體的模塊中訪問(wèn),不允許在其他模塊中訪問(wèn)
- fileprivate:只允許在定義實(shí)體的源文件中訪問(wèn)
- private:只允許在定義實(shí)體的封閉聲明中訪問(wèn)
2、絕大部分實(shí)體默認(rèn)都是internal級(jí)別
訪問(wèn)級(jí)別的使用準(zhǔn)則
1、一個(gè)實(shí)體不可以被更低訪問(wèn)級(jí)別的實(shí)體定義,比如
- 變量\常量類(lèi)型 >= 變量\常量
- 參數(shù)類(lèi)型、返回值類(lèi)型 >= 函數(shù)
- 父類(lèi) >= 子類(lèi)
- ……
元組類(lèi)型
1、元組類(lèi)型的訪問(wèn)界別是所有成員類(lèi)型最低的那個(gè)
internal struct Dog {} fileprivate class Person {} //(Dog, Person)的訪問(wèn)級(jí)別是fileprivate fileprivate var data1: (Dog, Person) private var data2: (Dog, Person)
泛型類(lèi)型
1、泛型類(lèi)型的訪問(wèn)級(jí)別是 類(lèi)型的訪問(wèn)級(jí)別 以及 所有泛型類(lèi)型參數(shù)的訪問(wèn)級(jí)別 中最低的那個(gè)
成員、嵌套類(lèi)型
1、類(lèi)型的訪問(wèn)級(jí)別會(huì)影響成員(屬性、方法、初始化器、下標(biāo))嵌套類(lèi)型的默認(rèn)訪問(wèn)級(jí)別
- 一般情況下,類(lèi)型為private或fileprivate,那么成員\嵌套類(lèi)型默認(rèn)也是private或fileprivate
- 一般情況下,類(lèi)型為internal或public,那么成員\嵌套類(lèi)型默認(rèn)是internal
2、直接在全局作用域下定義的private等價(jià)于fileprivate
private struct Dog { var age: Int = 0 func run() {} } fileprivate struct Person { var dog: Dog = Dog() mutating func walk() { dog.run() dog.age = 1 } }
3、子類(lèi)重寫(xiě)的成員訪問(wèn)級(jí)別必須 >= 父類(lèi)的成員訪問(wèn)級(jí)別
getter與setter
1、getter、setter默認(rèn)自動(dòng)接收他們所屬環(huán)境的訪問(wèn)級(jí)別
2、可以給setter單獨(dú)設(shè)置一個(gè)比getter更低的訪問(wèn)級(jí)別,用以限制寫(xiě)的權(quán)限
fileprivate(set) public var num = 10 class Person { private(set) var age = 0 fileprivate(set) public var weight: Int { set {} get { 10 } } internal(set) public subscript(index: Int) -> Int { set {} get { index } } }
初始化器
1、如果一個(gè)public類(lèi)想在另一個(gè)模塊調(diào)用編譯生成的默認(rèn)無(wú)參初始化器,必須顯式提供public的無(wú)參初始化器
因?yàn)閜ublic類(lèi)的默認(rèn)初始化器時(shí)internal級(jí)別的
2、required初始化器必須跟他所屬類(lèi)擁有相同的訪問(wèn)級(jí)別
3、如果結(jié)構(gòu)體有private\fileprivate的存儲(chǔ)實(shí)例屬性,那么它的成員初始化器也是private\fileprivate
否則默認(rèn)就是internal
枚舉類(lèi)型的case
1、不能給enum的每個(gè)case單獨(dú)設(shè)置訪問(wèn)級(jí)別
2、每個(gè)case自動(dòng)接收enum的訪問(wèn)級(jí)別
public enum定義的case也是public
協(xié)議
1、協(xié)議中定義的要求(方法)自動(dòng)接收協(xié)議的訪問(wèn)級(jí)別,不能單獨(dú)設(shè)置訪問(wèn)級(jí)別
public協(xié)議定義的要求(方法)也是public
2、協(xié)議實(shí)現(xiàn)的訪問(wèn)級(jí)別必須 >= 類(lèi)型的訪問(wèn)級(jí)別,或者 >= 協(xié)議的訪問(wèn)級(jí)別
擴(kuò)展
1、如果有顯式設(shè)置擴(kuò)展的訪問(wèn)級(jí)別,擴(kuò)展添加的成員自動(dòng)接收擴(kuò)展的訪問(wèn)級(jí)別
2、如果沒(méi)有顯式設(shè)置擴(kuò)展的訪問(wèn)級(jí)別,擴(kuò)展添加的成員的默認(rèn)訪問(wèn)級(jí)別,跟直接在類(lèi)型中定義的成員一樣
3、可以單獨(dú)給擴(kuò)展添加的成員設(shè)置訪問(wèn)級(jí)別
4、不能給用于遵守協(xié)議的擴(kuò)展顯式設(shè)置擴(kuò)展的訪問(wèn)級(jí)別
5、在同一文件中的擴(kuò)展,可以寫(xiě)成類(lèi)似多個(gè)部分的類(lèi)型聲明
- 在原本的聲明中聲明一個(gè)私有成員,可以在同一文件的擴(kuò)展中訪問(wèn)他
- 在擴(kuò)展中聲明一個(gè)私有成員,可以在同一文件的其他擴(kuò)展中、原本生明中訪問(wèn)他
將方法賦值給var\let
1、方法也可以像函數(shù)那樣,賦值給一個(gè)let或者var
struct Person { var age: Int func run(_ v: Int) { print("func run", age, v) } } var fn: (Person) -> (Int) -> () = Person.run(_:) fn(Person(age: 10))(20)
一些補(bǔ)充知識(shí)
CustomStringConvertible
1、遵守CustomStringConvertible、CustomDebugStringConvertible協(xié)議,都可以自定義實(shí)例的打印字符串
class Person: CustomStringConvertible, CustomDebugStringConvertible { var age = 0 var description: String { "person_\(age)" } var debugDescription: String { "debug_person_\(age)" } }
2、print調(diào)用的是CustomStringConvertible協(xié)議的description
3、debugPrint、po調(diào)用的是CustomDebugStringConvertible協(xié)議的debugDescription
Self
1、Self一般用作返回值類(lèi)型,限定返回值跟方法調(diào)用者必須是同一類(lèi)型(也可以作為參數(shù)類(lèi)型)
2、Self代表當(dāng)前類(lèi)型
class Person { var age = 1 static var count = 2 func run() { print(self.age) // 1 print(Self.count) // 2 } }
assert (斷言)
1、很多編程語(yǔ)言都有斷言機(jī)制:不符合指定條件就拋出運(yùn)行時(shí)錯(cuò)誤,常用語(yǔ)調(diào)試(Debug)階段的條件判斷
2、默認(rèn)情況下,Swift的斷言只會(huì)在debug模式下生效,release模式下會(huì)忽略
func divide(_ v1: Int, _ v2: Int) -> Int { assert(v2 != 0, "除數(shù)不能為0") return v1 / v2 }
fatalError
1、如果遇到嚴(yán)重問(wèn)題,希望結(jié)束程序運(yùn)行時(shí),可以直接使用fatalError函數(shù)拋出錯(cuò)誤(這是無(wú)法通過(guò)do-catch捕捉的錯(cuò)誤)
2、使用了fatalError函數(shù),就不需要再寫(xiě)return
func test(_ num: Int) -> Int { if num >= 0 { return 1 } fatalError("num不能小于0") }
3、在某些不得不實(shí)現(xiàn),但不希望別人調(diào)用的方法,可以考慮內(nèi)部使用fatalError函數(shù)
class Person { required init() {} } class Student: Person { required init() { fatalError("don't call Student init()") } init(score: Int) {} } var stu1 = Student(score: 98) var stu2 = Student()
到此這篇關(guān)于Swift Access Control訪問(wèn)控制與斷言詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Swift Access Control內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單了解Swift語(yǔ)言中的break和continue語(yǔ)句的用法
這篇文章主要簡(jiǎn)單介紹了Swift語(yǔ)言中的break和continue語(yǔ)句的用法,與其他語(yǔ)言的一樣用于循環(huán)語(yǔ)句流程控制,需要的朋友可以參考下2015-11-11swift4 使用DrawerController實(shí)現(xiàn)側(cè)滑菜單功能的示例代碼
這篇文章主要介紹了swift4 使用DrawerController實(shí)現(xiàn)側(cè)滑功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程
這篇文章主要介紹了使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程,講到了iOS中提供的NSXMLParser和NSXMLParserDelegate兩個(gè)API的用法,需要的朋友可以參考下2016-04-04Swift4使用GCD實(shí)現(xiàn)計(jì)時(shí)器
這篇文章主要為大家詳細(xì)介紹了Swift4使用GCD實(shí)現(xiàn)計(jì)時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例
快速排序是一種不穩(wěn)定的排序,存在著優(yōu)化空間,這里我們來(lái)看快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例:2016-07-07swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景詳解
在Swift 2.0中,Apple提供了defer關(guān)鍵字,讓我們可以實(shí)現(xiàn)同樣的效果,這篇文章主要介紹了關(guān)于swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用defer具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧。2018-03-03