Swift開發(fā)入門-進階知識(一),附demo

Swift是一門新的語言,不過現(xiàn)在已經(jīng)出到Swift4了,很多人想學(xué)Swift,不知從何開始,今天我就簡單說下入門知識,我認為在學(xué)習(xí)Swift之間最好先把這些基本的知識掌握了,才能更好的去認識它學(xué)習(xí)它,使用它.

全是干貨,并且附上demo:Swift開發(fā)進階知識(01)demo.

閱讀順序:
Swift開發(fā)入門-基礎(chǔ)知識.
Swift開發(fā)入門-進階知識(一).
Swift開發(fā)入門-進階知識(二).

開始 --- Swift --- Coding

一、Swift進階知識須知

  • 我在上一篇文章中簡單介紹了一下基礎(chǔ)知識,認真看完基礎(chǔ)知識后,大多數(shù)人應(yīng)該可以試著開發(fā)一個小demo.
  • 但是想寫一個功能性的demo,還是不行的,還是有很多東西我們需要了解.
  • 在看這篇文章(demo)前,我建議把入門的基礎(chǔ)知識先了解一下.參考鏈接:http://www.itdecent.cn/p/3b01707fed18

二、閉包的基本格式

閉包是swift中常用的一個知識點
閉包和OC中的block類似

  1. 閉包是提前定義的一段可以執(zhí)行的代碼塊
  2. 可以當(dāng)做參數(shù) 在函數(shù)中傳遞
  3. 在需要的時候執(zhí)行代碼塊引用,完成回調(diào)的作用
  4. 在block中如果訪問到了self或者其屬性的時候,要注意考慮循環(huán)引用

我通過幾個例子來展示閉包的使用方法

1.沒有參數(shù)沒有返回值的閉包
  //使用閉包來實現(xiàn)demo1A
    //() -> ()沒有參數(shù)沒有返回值的閉包
    func demo1B() {
        let closure: () -> () = { () -> () in
            print("我是一個沒有參數(shù)沒有返回值的閉包")
        }
        //執(zhí)行閉包
        closure()
    }
    
    func demo1A() {
        func sum(){
            print("我是一個沒有參數(shù)沒有返回值的方法")
        }
        sum()   //調(diào)用方法
    }
2.有參數(shù)沒有返回值的閉包
  • 閉包是一個封閉的結(jié)構(gòu):閉包的參數(shù),返回值 和閉包需要執(zhí)行的代碼片段都應(yīng)該在閉包的內(nèi)部
  • in 是一個分割的標記
    //使用閉包來實現(xiàn)demo2A
    func demo2B() {
        let closure = { (a: Int,b: Int) -> () in
            let res = a + b
            print(res)
        }
        //執(zhí)行閉包
        closure(2, 3)
    }
    
    func demo2A() {
        func sum(a: Int,b: Int){
            let res = a + b
            print(res)
        }
        sum(a: 2, b: 3)  //執(zhí)行
    }
3.有參數(shù)有返回值的閉包
    func demo3B() {
        let closure = { (a: Int,b: Int) -> Int in
            let res = a + b
            return res
        }
        //執(zhí)行閉包
        //回調(diào)結(jié)果應(yīng)該放在參數(shù)部分還是返回值部分??
        //放在參數(shù)部分來進行回調(diào)
        let res = closure(3, 3)
        print(res)
    }

三、閉包的調(diào)用

  • 閉包可作為函數(shù)的參數(shù)來調(diào)用,執(zhí)行回調(diào)
    先寫兩個帶閉包參數(shù)的方法,一個只有閉包參數(shù),第二個還帶有一個非閉包的參數(shù)
    //模擬網(wǎng)絡(luò)請求
    func loadData(finishedCallBack: @escaping (String) -> ()) {
        //1.在全局隊列中做耗時操作
        DispatchQueue.global().async {
            //在全局隊列中休眠
            Thread.sleep(forTimeInterval: 1)
            //2.在主隊列中回調(diào)數(shù)據(jù)
            DispatchQueue.main.async {
                //執(zhí)行閉包
                finishedCallBack("哈哈哈哈哈哈哈哈哈")
            }
        }
    }
    
    func loadData(userName: String,finishedCallBack: @escaping (String) -> ()) {
        //1.在全局隊列中做耗時操作
        DispatchQueue.global().async {
            //在全局隊列中休眠
            Thread.sleep(forTimeInterval: 1)
            //2.在主隊列中回調(diào)數(shù)據(jù)
            DispatchQueue.main.async {
                //執(zhí)行閉包
                finishedCallBack("嘎嘎嘎嘎嘎嘎嘎")
            }
        }
    }
閉包調(diào)用
//第一個函數(shù)
 loadData { (result) in
            print(result)
        }

//第二個函數(shù)
 loadData(userName: "小明") { (result) in
            print(result)
        }
  • 當(dāng)最后一個參數(shù)是閉包的時候,可以形成尾隨閉包
    尾隨閉包注意點:
    1.系統(tǒng)會幫你簡寫,不需要coder手動簡寫
    2.簡寫的規(guī)律:當(dāng)函數(shù)最后一個參數(shù)是閉包的時候,函數(shù)的參數(shù)的 '()' 會提前關(guān)閉
    3.如果函數(shù)只有閉包一個參數(shù) '()'可以省略

四、 閉包的循環(huán)調(diào)用

閉包和OC的Block類似,都有可能造成循環(huán)引用

  • 第一種方式: weak self 當(dāng)self被系統(tǒng)回收時,self的地址會自動指向nil
    ->和OC中的 __weak 類似
  • 第二種方法: [unowned self]當(dāng)self被系統(tǒng)回收時,self的地址不會自動指向nil ,有可能導(dǎo)致壞地址,野指針
    -> 和OC中的 __unsafe_unretained 關(guān)鍵字的作用類似

可選解包有什么作用呢?
->調(diào)用方法或者屬性的時候 使用可選解包,如果調(diào)用的對象為nil 就不會繼續(xù)執(zhí)行

解決方法:

    //1.模仿OC的解決方式
    func swiftMethodInOC() {
        weak var weakSelf = self
        loadData { (result) in
            print(weakSelf?.view ?? "2")
        }
    }
    //2.unowned
    func swiftClosureMethod() {
        loadData { [unowned self] (result) in
            
            print(self.view)
        }
    }

五、Swift命名空間

我們在swift中調(diào)用其他類,不需要導(dǎo)入頭文件

  • 這是因為swift支持命名空間
  • 在同一個命名空間中(以項目為一個維度),默認所有的文件共享, 不需要導(dǎo)入頭文件

六、Swift面向?qū)ο蟮谋剡x屬性

新建一個Person類,并添加一個必選屬性: var name: String
新建一個Student類,繼承于Person類,并添加一個必選屬性: var number: String

Person類內(nèi)容:

class Person: NSObject {
    
    var name: String
    
    //override 重寫 面向?qū)ο蟮闹匾卣?父類已經(jīng)存在的方法或者屬性,子類需要做特殊的操作 可以重寫
    //重寫的特點:在方法的內(nèi)部可以super
    //構(gòu)造方法必須對 必選屬性 負責(zé),對象構(gòu)造成功之后,必選屬性必須有值
    //對象的初始化分段進行,先初始化子類(給必選屬性賦值),再初始化父類
    //super.init  是對象構(gòu)造結(jié)束的標記
    override init() {
        //在隱式生成super.init 之前沒有給self.name設(shè)置初始值,會報錯
        name = "小明"
        super.init()
        
        /*
         下面這個寫法會報錯,先寫
         super.init()
         name = "1"
         */
        
        memeda()
    }    
    //添加一個對象方法
    
    func memeda() {
        print("么么噠")
    }
}

student類:


class Student: Person {

    var number: String
    
    override init() {
        number = "001"
        super.init()
    }
    
}

調(diào)用:

  func fiveDemo() {
        let p = Person()
        print(p.name)
        
        let s = Student()
        print(s.number,s.name)
    }
    

所有的關(guān)于必選屬性的說明,都在代碼的注釋里面,不贅述.

總結(jié)

相較于上一篇文章Swift開發(fā)入門-基礎(chǔ)知識(一),這稍微有點難度,但是在開中,這些都是基本技能,是入門知識.

學(xué)習(xí)swift還有一個很好的教材,那就文檔,很多不喜歡看文檔最主要的原因是因為,看不懂英文.還好swift有中文版的文檔:swift4中文文檔
配合學(xué)習(xí),加油 加油!!!

最后,附上這篇文上所有代碼的demo: Swift開發(fā)進階知識(01)demo.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容