欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    程序員連自己寫的源代碼都不想讀, 怎么可能看別人寫的源代碼! 每半年獲得的知識相當于之前獲得的全部知識的總和.

    個人覺得這句話還是蠻有道理的. 反正對于我來說, 每過一段的時間回過頭來看自己寫的代碼都感覺有很大的重構空間, 很多地方寫的不夠 , 雖然我不是一個處女座, 但是對于代碼的健壯和整潔還是很注意的.

    接下來, 我來扯一扯談一談最近寫 Swift 遇到的那些坑問題吧.

    感受

    首先說下 Swift 給我帶來的感受吧, Swift 的剛開始使用的時候感覺還是太特么難用了可以的.

    不過 Xcode 在 Swift 上的補全極其慢, 因為 Swift 所有的屬性方法都是默認公開的, 所以可能是因為每次都要搜索全局的符號導致自動補全非常緩慢, 嚴重影響了工作效率, 有同樣的問題的請戳這里. 當然也不排除我電腦配置的影響, 不過重寫的過程還是蠻順利的, 沒有遇到太多的問題, 而且使用了很多 Swift 的高級特性來縮減原來冗長的 ObjC 代碼.

    構造器 init

    好了然后, 談一下我在這兩天中寫 Swift 時遇到的最大問題 —- 構造器 init 的使用.

    注: 我們在這篇博客中提到的構造器都為類構造器, 在這里不提及值構造器的使用,詳見文檔.

    剛剛使用這個構造器的時候我感覺到很困惑啊, 不就是個 init, 你給我搞這么多事情干什么? 我只想安安靜靜地初始化

    開始使用 init

    當我遵從以前寫 ObjC 的習慣, 在 Swift 中鍵入 init 之后, 編譯器提醒我:

    復制代碼已復制

    '' 'init(coder:)' must be by of ''

    這是什么意思 (,#?Д?), 好吧, 這個錯誤竟然可以點. 于是開心地雙擊, 然后呢, Xcode 在我們的屏幕中自動生成了這些東西:

    Swift

    復制代碼

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    隨后, 我就如在 ObjC 中一樣在 init 方法中調用了 super.init(), (/= _ =)/~┴┴ 怎么還有錯誤?

    這是啥意思?

    復制代碼

    Must call a of the ''

    必須調用一個 的指定構造器. 算了先不管了, 繼續寫好了. 于是又出現呢了下面的提示:

    復制代碼已復制

    for '' must (with 'self.init') than to a (with 'super.init')

    既然說 構造器不能調用 super.init, 那么按照錯誤提示改成 self.init 應該就好了.

    復制代碼

    Could not find ''

    既然報了這個錯誤, 那么如果加上 呢

    復制代碼

    Could not fond an for 'init' that the

    ug10后處理構造器下載_ug構造展平圖樣怎么用_視頻剪切合并器下載后如何打開

    找不到 init 方法接收所提供參數的重載.

    最后一個常見的錯誤大概是這樣的

    復制代碼

    'self.label' not at super.init call

    Orz, 到這里我已經放棄了自己通過嘗試來解決這些問題了. 于是我求助于 , 最后怒看蘋果的官網文檔并找到了以上錯誤的全部答案.

    使用 init 方法的正確姿勢

    蘋果的官方文檔關于構造器的部分請戳這里

    在 Swift 中, 類的初始化有兩種方式, 分別是

    ce

    在本篇博客中譯為指定構造器, 而 譯為便利構造器.

    指定構造器在一個類中必須至少有一個, 而便利構造器的數量沒有限制.

    指定構造器 ( ) are the for a class. A fully all by that class and calls an to the up the chain.

    指定構造器是類的主要構造器, 要在指定構造器中初始化所有的屬性, 并且要在調用父類合適的指定構造器.

    每個類應該只有少量的指定構造器, 大多數類只有一個指定構造器, 我們使用 Swift 做 iOS 開發時就會用到很多 UIKit 框架類的指定構造器, 比如說:

    Swift

    復制代碼

    init()

    init(frame: )

    init(style: , : ?)

    這些都是類指定構造器, 并且這些方法的前面是沒有任何的關鍵字的 (包括 ).

    當定義一個指定構造器的時候, 必須調用父類的某一個指定構造器:

    Swift

    復制代碼

    init(: , : = "") {

    super.init(style: ., : nil)

    ...

    }

    在這里我們的指定構造器調用了父類的指定構造器 super.init(style: ., : nil).

    便利構造器 ( ) are , for a class. You can a to call a from the same class as the with some of the ’s set to . You can also a to an of that class for a use case or input value type.

    便利構造器是類的次要構造器, 你需要讓便利構造器調用同一個類中的指定構造器, 并將這個指定構造器中的參數填上你想要的默認參數.

    如果你的類不需要便利構造器的話, 那么你就不必定義便利構造器, 便利構造器前面必須加上 關鍵字.

    ug10后處理構造器下載_ug構造展平圖樣怎么用_視頻剪切合并器下載后如何打開

    在這里我們就不舉例了, 但是我們要提一下便利構造器的語法:

    Swift

    復制代碼

    init() {

    }

    init 規則

    定義 init 方法必須遵循三條規則

    指定構造器必須調用它直接父類的指定構造器方法.便利構造器必須調用同一個類中定義的其它初始化方法.便利構造器在最后必須調用一個指定構造器.

    如下圖所示:

    在圖中, 只有指定構造器才可以調用父類的指定構造器, 而便利構造器是不可以的, 這也遵循了我們之前所說的三條規則.

    只要 init 方法遵循這三個規則就不會有任何問題.

    init 機制

    在 Swift 中一個實例的初始化是分為兩個階段的

    第一階段是實例的所有屬性被初始化.第二階段是實例的所有屬性可以再次的調整以備之后的使用.

    而這與 ObjC 的區別主要在于第一部分, 因為在 ObjC 中所有的屬性如果不賦值都會默認被初始化為 nil或者 0. 而在 Swift 中可以所有屬性的值由開發者來指定.

    Swift 的編譯器會對初始化的方法進行安全地檢查已保證實例的初始化可以被安全正確的執行:

    指定構造器必須要確保所有被類中提到的屬性在代理向上調用父類的指定構造器前被初始化, 之后才能將其它構造任務代理給父類中的構造器.指定構造器必須先向上代理調用父類中的構造器, 然后才能為任意屬性賦值.便利構造器必須先代理調用同一個類中的其他構造器, 然后再為屬性賦值.構造器在第一階段構造完成之前, 不能調用任何實例方法, 不能讀取任何實例屬性的值ug10后處理構造器下載ug10后處理構造器下載,self 不能被引用.

    接下來我們來說明一下類構造的兩個階段:

    階段 1

    子類的便利構造器首先會被調用, 這時便利構造器無法修改子類的任何屬性.便利構造器會調用子類中的指定構造器, 指定構造器 (子類) 要確保所有的屬性都已賦值, 完成所屬內存的初始化,接著會指定構造器 (子類) 會調用父類中的指定構造器, 完成父類屬性所屬內存的初始化, 直到達到構造器鏈的最頂部. 所有的屬性以及內存被完全初始化, 然后進入第 階段 2.階段 2

    父類中的指定構造器定制實例的屬性 (可能).子類中的指定構造器定制實例的屬性.子類中的便利構造器定制實例的屬性.init 的繼承和重載 in -C, Swift do not their by . Swift’s a in which a from a is by a more and is used to a new of the that is not fully or .

    跟 ObjC 不同, Swift 中的子類默認不會繼承來自父類的所有構造器. 這樣可以防止錯誤的繼承并使用父類的構造器生成錯誤的實例(可能導致子類中的屬性沒有被賦值而正確初始化). 與方法不同的一點是, 在重載構造器的時候, 你不需要添加 關鍵字.

    雖然子類不會默認繼承來自父類的構造器, 但是我們也可以通過別的方法來自動繼承來自父類的構造器, 構造器的繼承就遵循以下的規則:

    如果子類沒有定義任何的指定構造器, 那么會默認繼承所有來自父類的指定構造器.如果子類提供了所有父類指定構造器的實現, 不管是通過 規則 1 繼承過來的, 還是通過自定義實現的, 它將自動繼承所有父類的便利構造器.錯誤分析

    我們到目前為止已經基本介紹了所有的構造器使用的注意事項, 接下來我們分析一下最開始錯誤的原因.

    錯誤 1

    第一個錯誤是因為, 我們一開始雖然沒有為指定構造器提供實現, 不過, 因為重載了指定構造器, 所以來自父類的指定構造器并不會被繼承.

    如果子類沒有定義任何的指定構造器, 那么會默認繼承所有來自父類的指定構造器.

    而 init(coder : ) 方法是來自父類的指定構造器, 因為這個構造器是 , 必須要實現. 但是因為我們已經重載了 init(), 定義了一個指定構造器, 所以這個方法不會被繼承, 要手動覆寫, 這就是第一個錯誤的原因.

    錯誤 2

    視頻剪切合并器下載后如何打開_ug構造展平圖樣怎么用_ug10后處理構造器下載

    Swift

    復制代碼

    class : {

    init() {

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    }

    我們已經手動覆寫了這個方法, 然后, 因為 init() 方法雖然被重載了, 但是并沒有調用父類的指定構造器:

    指定構造器必須調用它最近父類的指定構造器.

    所以我們讓這個指定構造器調用 super.init(style: , : ?), 解決了這個問題.

    Swift

    復制代碼

    class : {

    init() {

    super.init(style: ., : nil)

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    }

    錯誤 3

    Swift

    復制代碼

    class : {

    init() {

    super.init(style: ., : nil)

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    視頻剪切合并器下載后如何打開_ug構造展平圖樣怎么用_ug10后處理構造器下載

    }

    }

    錯誤 3 跟前面的兩個錯誤沒有直接的聯系. 這里的構造器是一個便利構造器 (注意前面的 關鍵字), 而這里的錯誤違反了這一條規則:

    便利構造器必須調用同一個類中定義的其它構造器 (指定或便利).

    所以我們讓這個便利構造器調用同一個類的 self.init(style: , : ?) 的指定構造器.

    Swift

    復制代碼

    class : {

    init() {

    self.init(style: ., : nil)

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    }

    而這段代碼目前還是有問題的, 而這就是 錯誤 4 的代碼.

    錯誤 4

    錯誤 4 的主要原因就是重載了父類的 init(coder : ) 指定構造器, 導致父類的指定構造器 init(style: ., : nil) 并沒有被當前類 繼承, 所以當前類中是沒有 init(style: ., : nil) 指定構造器.

    如果子類沒有定義任何的指定構造器, 那么會默認繼承所有來自父類的指定構造器.

    Swift

    復制代碼

    class : {

    init() {

    self.init(style: ., : nil)

    }

    }

    只需要刪掉這個 init(coder : ) 方法就可以解決這個錯誤了.

    錯誤 5

    Swift

    復制代碼

    class : {

    ug構造展平圖樣怎么用_視頻剪切合并器下載后如何打開_ug10后處理構造器下載

    let label :

    init(: ) {

    super.init(style: ., : nil)

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    }

    錯誤 5 的主要原因是違反了這一條規則, 它在調用 super.init(style: ., : nil) 之前并沒有初始化自己的所有屬性.

    指定構造器必須要確保所有被類中提到的屬性在代理向上調用父類的指定構造器前被初始化, 之后才能將其它構造任務代理給父類中的構造器.

    因為 label 屬性不是 的, 所以這個屬性就必須初始化.

    Swift

    復制代碼

    init(: ) {

    self.label = ()

    super.init(style: ., : nil)

    }

    這是第一個解決的辦法, 不過我一般使用另一種, 在屬性定義的時候就為他說初始化一個值.

    Swift

    復制代碼

    class : {

    let label = ()

    init(: ) {

    super.init(style: ., : nil)

    }

    init(coder : ) {

    ("init(coder:) has not been ")

    }

    }

    這些就是我在使用 swift 的構造其中遇到的全部錯誤了.

    總結

    Swift 中構造器需要遵循的規則還是很多的, 總結一下, 有以下規則:

    Swift 中的構造器 init 中坑還是很多的, 而目前我也終于把這個構造器這個坑填上了, 最終決定還是要重新詳細看一遍 Swift 的官方文檔, 而整篇博客和問題的解決都是基于官方文檔的. 使用下來 Swift 比 -C 語言使用起來的注意事項和坑更多, 也有很多的黑魔法, 等待著我們去開發和探索.

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有