swift學習-構造,析構-(12/30)

上午忙著一個新項目上線的問題,中午吃飯也挺晚。吃完飯回來睡了一會,所以中午沒有學swift。 下午從3點開始,看到5點,晚上又看了很久。
今天看了不少,到第173頁。
swift引入的不確定類型(?),總覺得有點太過復雜,把原來許多挺好理解的東西都搞的四不像的。
還有類的構造過程,引入便利構造器,還有可失敗構造器,以及一系列默認構造器,再配合以繼承,真的太臃腫而繁瑣。感覺下個版本,構造函數(shù)這里肯定要大改。
今天發(fā)現(xiàn)了一個官方做app的教程,看了一點,很不錯,有swift的,xcode的,還有ui設計的,很容易讓人快速進入app開發(fā)。挺不錯的,看完swift就看這個教程吧。
筆記如下:

1 可失敗構造器。如果一個類,結構體或者枚舉,在構造自身的過程中有可能失敗,則定義為一個可失敗的構造器,語法為init?。
注: 可失敗構造器的參數(shù)名和參數(shù)類型,不能與其他非可失敗構造器的參數(shù)名及類型相同。
構造失敗,返回nil。
例如:

struct Animal {
    let species: String

    init?(species: String?) {
        if ((species == nil)
            || (species!.isEmpty)){
            return nil
        } else {
            self.species = species!
        }
    }
}

//返回可選類型 Animal?
let animal = Animal.init(species: "")

帶原始值的枚舉類型會自帶一個可失敗構造器init?(rawValue:)。
2 你可以用子類的可失敗構造器覆蓋父類的可失敗構造器,你也可以用子類的非可失敗構造器覆蓋一個基類的可失敗構造器。
注:一個非可失敗構造器永遠也不能代理調用一個可失敗構造器。你可以用一個非可失敗構造器覆蓋一個可失敗構造器,反過來卻不行。
在構造器前加required關鍵字來保證該類的所有子類都必須實現(xiàn)該構造器。當子類在覆蓋父類的required構造器時,必須同樣加required關鍵字,無需加override關鍵字。
3 使用閉包或全局函數(shù)初始化存儲屬性。

struct Checkerboard {
    let boardColors: [Bool] = {
        var temporaryBoard = [Bool]()
        var isBlack = false

        for i in 1...10 {
            for j in 1...10 {
                temporaryBoard.append(isBlack)
                isBlack = !isBlack
            }
        }

        return temporaryBoard
    }() //()很關鍵
}

var checkrboard = Checkerboard()

4 析構,swift的析構函數(shù)通過deinit定義。不允許主動調用自己的析構函數(shù),
swift通過引用計數(shù)的方式來進行gc,所以觸發(fā)deinit的方式,可以簡單的將該引用設置為nil。

class Persion {
    var name: String

    init(name: String = "sigh") {
        self.name = name

        print("hi \(name)")
    }

    deinit {
        print("bye bye")
    }
}

var p1: Persion? = Persion()
var p2: Persion? = p1

p1 = nil
p2 = nil //觸發(fā)析構

5 閉包循環(huán)引用。

class HtmlElement {
    let name: String
    let text: String?

    //在默認的閉包中可以使用self,因為只有在初始化完成,且self確實存在時,才能訪問lazy屬性
    lazy var asHtml: ()-> String = {
        var res: String

        if let text = self.text {
            res = "<\(self.name)>\(text)</\(self.name)>"
        } else {
            res = "<\(self.name)/>"
        }

        return res
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }
}

var htmlElement = HtmlElement(name: "hello")

print(htmlElement.asHtml())

在閉包中使用了self,強引用了類,而類也強引用了閉包。
swift對于循環(huán)引用的解決方案,引入弱引用和無主引用的方式,感覺也是有點偷懶的設計,完全可以在編譯層面解決這個問題,而不是說把這些暴露給用戶。

明天繼續(xù)看吧。
這周目標200頁,問題應該不大。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容