最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift Access Control訪問控制與斷言詳細(xì)介紹

 更新時(shí)間:2022年09月13日 14:25:57   作者:撲騰的蛾子  
這篇文章主要介紹了Swift Access Control訪問控制與斷言,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

訪問控制(Access Control)

1、在訪問權(quán)限控制這塊,Swift提供了5個(gè)不同的訪問級別(以下是從高到低排序,實(shí)體指被訪問級別修飾的內(nèi)容)

  • open:允許在定義實(shí)體的模塊、其他模塊中訪問,允許其他莫模塊進(jìn)行繼承、重寫(open只能用在類、類成員上)
  • public:允許在定義實(shí)體的模塊、其他模塊中訪問,不允許其他模塊進(jìn)行繼承、重寫
  • internal:只允許在定義實(shí)體的模塊中訪問,不允許在其他模塊中訪問
  • fileprivate:只允許在定義實(shí)體的源文件中訪問
  • private:只允許在定義實(shí)體的封閉聲明中訪問

2、絕大部分實(shí)體默認(rèn)都是internal級別

訪問級別的使用準(zhǔn)則

1、一個(gè)實(shí)體不可以被更低訪問級別的實(shí)體定義,比如

  • 變量\常量類型 >= 變量\常量
  • 參數(shù)類型、返回值類型 >= 函數(shù)
  • 父類 >= 子類
  • ……

元組類型

1、元組類型的訪問界別是所有成員類型最低的那個(gè)

internal struct Dog {}
fileprivate class Person {}
 
//(Dog, Person)的訪問級別是fileprivate
fileprivate var data1: (Dog, Person)
private var data2: (Dog, Person)

泛型類型

1、泛型類型的訪問級別是 類型的訪問級別 以及 所有泛型類型參數(shù)的訪問級別 中最低的那個(gè)

成員、嵌套類型

1、類型的訪問級別會影響成員(屬性、方法、初始化器、下標(biāo))嵌套類型的默認(rèn)訪問級別

  • 一般情況下,類型為private或fileprivate,那么成員\嵌套類型默認(rèn)也是private或fileprivate
  • 一般情況下,類型為internal或public,那么成員\嵌套類型默認(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、子類重寫的成員訪問級別必須 >= 父類的成員訪問級別

getter與setter

1、getter、setter默認(rèn)自動接收他們所屬環(huán)境的訪問級別

2、可以給setter單獨(dú)設(shè)置一個(gè)比getter更低的訪問級別,用以限制寫的權(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類想在另一個(gè)模塊調(diào)用編譯生成的默認(rèn)無參初始化器,必須顯式提供public的無參初始化器

因?yàn)閜ublic類的默認(rèn)初始化器時(shí)internal級別的

2、required初始化器必須跟他所屬類擁有相同的訪問級別

3、如果結(jié)構(gòu)體有private\fileprivate的存儲實(shí)例屬性,那么它的成員初始化器也是private\fileprivate

否則默認(rèn)就是internal

枚舉類型的case

1、不能給enum的每個(gè)case單獨(dú)設(shè)置訪問級別

2、每個(gè)case自動接收enum的訪問級別

public enum定義的case也是public

協(xié)議

1、協(xié)議中定義的要求(方法)自動接收協(xié)議的訪問級別,不能單獨(dú)設(shè)置訪問級別

public協(xié)議定義的要求(方法)也是public

2、協(xié)議實(shí)現(xiàn)的訪問級別必須 >= 類型的訪問級別,或者 >= 協(xié)議的訪問級別

擴(kuò)展

1、如果有顯式設(shè)置擴(kuò)展的訪問級別,擴(kuò)展添加的成員自動接收擴(kuò)展的訪問級別

2、如果沒有顯式設(shè)置擴(kuò)展的訪問級別,擴(kuò)展添加的成員的默認(rèn)訪問級別,跟直接在類型中定義的成員一樣

3、可以單獨(dú)給擴(kuò)展添加的成員設(shè)置訪問級別

4、不能給用于遵守協(xié)議的擴(kuò)展顯式設(shè)置擴(kuò)展的訪問級別

5、在同一文件中的擴(kuò)展,可以寫成類似多個(gè)部分的類型聲明

  • 在原本的聲明中聲明一個(gè)私有成員,可以在同一文件的擴(kuò)展中訪問他
  • 在擴(kuò)展中聲明一個(gè)私有成員,可以在同一文件的其他擴(kuò)展中、原本生明中訪問他

將方法賦值給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ǔ)充知識

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一般用作返回值類型,限定返回值跟方法調(diào)用者必須是同一類型(也可以作為參數(shù)類型)

2、Self代表當(dāng)前類型

class Person {
    var age = 1
    static var count = 2
    func run() {
        print(self.age) // 1
        print(Self.count) // 2
    }
}

assert (斷言)

1、很多編程語言都有斷言機(jī)制:不符合指定條件就拋出運(yùn)行時(shí)錯(cuò)誤,常用語調(diào)試(Debug)階段的條件判斷

2、默認(rèn)情況下,Swift的斷言只會在debug模式下生效,release模式下會忽略

func divide(_ v1: Int, _ v2: Int) -> Int {
    assert(v2 != 0, "除數(shù)不能為0")
    return v1 / v2
}

fatalError

1、如果遇到嚴(yán)重問題,希望結(jié)束程序運(yùn)行時(shí),可以直接使用fatalError函數(shù)拋出錯(cuò)誤(這是無法通過do-catch捕捉的錯(cuò)誤)

2、使用了fatalError函數(shù),就不需要再寫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訪問控制與斷言詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Swift Access Control內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 特定用例下的Combine全面使用詳解

    特定用例下的Combine全面使用詳解

    這篇文章主要為大家介紹了特定用例下的Combine全面使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 分析Swift性能高效的原因

    分析Swift性能高效的原因

    絕大多數(shù)公司選擇Swift語言開發(fā)iOS應(yīng)用,主要原因是因?yàn)镾wift相比Objc有更快的運(yùn)行效率,更加安全的類型檢測,更多現(xiàn)代語言的特性提升開發(fā)效率;這一系列的優(yōu)點(diǎn)使Swift語言的熱度越來越高。
    2020-10-10
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個(gè)特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實(shí)例方法,封裝特定任務(wù)和功能處理給定類型的一個(gè)實(shí)例,需要的朋友可以參考下
    2015-01-01
  • Swift中的條件切換語句switch...case學(xué)習(xí)教程

    Swift中的條件切換語句switch...case學(xué)習(xí)教程

    這篇文章主要介紹了Swift中的條件切換語句switch...case學(xué)習(xí)教程,Swift中的switch...case支持的數(shù)據(jù)類型很多,非常之強(qiáng)大,需要的朋友可以參考下
    2016-04-04
  • Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    本篇文章主要介紹了Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)

    深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實(shí)現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Swift4.0 Array數(shù)組詳解

    Swift4.0 Array數(shù)組詳解

    這篇文章主要為大家詳細(xì)介紹了Swift4.0 Array數(shù)組的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • RxSwift學(xué)習(xí)教程之類型對象Subject詳解

    RxSwift學(xué)習(xí)教程之類型對象Subject詳解

    這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之類型對象Subject的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。
    2017-09-09
  • 深入理解Swift中的變量與常量

    深入理解Swift中的變量與常量

    本文主要是介紹Swift中最常用的常量和變量,將從“變量常量的定義”、"如何聲明變量常量"、“變量和常量的命名”,"變量常量的本質(zhì)區(qū)別"四個(gè)方面入手,重點(diǎn)介紹變量和常量的使用以及區(qū)別,希望大家在閱讀完本文后都可以熟練使用它們。有需要的朋友們下面來一起學(xué)習(xí)吧。
    2017-01-01
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)的相關(guān)資料,文中介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift具有一定的參考價(jià)值,需要的朋友下面來一起看看吧。
    2017-03-03

最新評論

姚安县| 商都县| 梅河口市| 景洪市| 额尔古纳市| 翁牛特旗| 云龙县| 西吉县| 大足县| 江达县| 汝城县| 资中县| 延安市| 封开县| 正安县| 甘谷县| 阿坝| 独山县| 北川| 奎屯市| 彭阳县| 余姚市| 金坛市| 资溪县| 昌邑市| 庄河市| 凤凰县| 水城县| 岳普湖县| 乌兰浩特市| 乌恰县| 乐至县| 宜川县| 隆尧县| 韶关市| 兰考县| 莎车县| 临夏县| 四子王旗| 太湖县| 那坡县|