深化解析Swift編程中的結構辦法。本站提示廣大學習愛好者:(深化解析Swift編程中的結構辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是深化解析Swift編程中的結構辦法正文
一、引言
結構辦法是一個類創立對象最先也是必需調用的辦法,在Objective-C中,開發者更習氣稱這類辦法為初始化辦法。在Objective-C中的初始化辦法與普通函數相比除了要以init低頭外並無太嚴厲的分界,而在Swift言語體系中,結構辦法與普通的辦法分界非常嚴厲,從格式寫法上就有不同,普通辦法函數要以func聲明,結構辦法一致為init命名,不需求func關鍵字聲明,不同的結構辦法采用辦法重載的方式創立。
二、結構辦法的復寫與重載
在Objective-C中,不同的初始化辦法就是不同的函數,這便不存在辦法重載的概念。Swift中要創立自定義的結構辦法,需求開發者對init結構辦法停止重載操作。任何一個自定義的類,只需其有父類,除了可以承繼上去父類已有的結構辦法外,還可以復寫父類的結構辦法,使其適用於本身。和Objective-C相似,復寫父類的結構辦法時,要在其中調用父類的結構辦法,重載可以了解為一種特殊的復寫父類結構辦法,因而在重載的結構辦法中也要調用父類的結構辦法。
創立一個承繼於NSObject的類,復寫結構辦法,代碼示例如下:
class ClassOne: NSObject { //聲明一個本類特有的常量 var tip:Int //復寫父類的結構辦法 需求用override關鍵字 override init() { //結構辦法中要對一切成員常量完成創立 tip = 1; //在創立完一切成員常量後 調用父類結構辦法 super.init() } //重載結構辦法1 init(one:Int){ tip=one super.init() } //重載結構辦法2 運用convenience關鍵字停止修飾 convenience init(two:String) { //運用convenience關鍵字停止修飾的結構辦法要調用本類的結構辦法停止 self.init(one: two.characters.count) } //重載結構辦法3 運用required關鍵字停止修飾 運用required關鍵字停止修飾的結構辦法子類必需承繼或復寫 required init(three:Float) { tip=10 super.init() }
下面示例代碼中,不帶參數的init()辦法為復寫父類的辦法,因而需求運用關鍵字override來修飾。重載結構辦法1帶一個Int類型的 參數,父類中並沒有這個結構辦法,但是在其完成中,仍然需求調用父類中的某個結構辦法完成。結構辦法2是一個帶String類型參數的結構辦法,其用convenience關鍵字為結構辦法的一個修飾關鍵字,前面會引見。結構辦法3為一個帶Float類型參數的結構辦法,但其運用required關鍵字停止了修飾,運用required關鍵字停止修飾的結構辦法子類必需承繼或許復寫。結構辦法1,2,3都是對init()結構辦法的一種重載,但卻是3中類型全然不同的結構辦法。
三、Designated結構辦法與Convenience結構辦法
Swift中的結構辦法分為Designated結構辦法與Convenience結構辦法兩類,Designated結構辦法也被稱為指定結構辦法,Convenience結構辦法也被稱為方便結構辦法。Designated結構辦法不加任何修飾關鍵字,Convenience結構辦法需求運用Convenience關鍵字停止修飾。可以這樣了解,Convenience類型的結構辦法是為了方便運用從Designated結構辦法中分收入來的結構辦法,官方文檔中有如下描繪:
1.子類Designated結構辦法中必需調用父類的Designated結構辦法。
2.Convenience結構辦法中必需調用以後類的結構辦法。
3.Convenience結構辦法歸根結底要調用到Designated結構辦法。
官方文檔的一張圖可以明晰的描繪上述關系:
四、結構辦法的承繼關系
關於子類承繼父類的結構辦法有這樣幾個特性:
1.假如子類沒有復寫任何父類的結構辦法,則默許子類將承繼一切父類的結構辦法,包括Designated結構辦法與Convenience結構辦法。
2.假如子類復寫了父類某一結構辦法,則子類默許不在承繼一切父類的結構辦法,關於Designated類型的結構辦法,子類復寫了哪些,哪些才干夠被運用,關於Convenienve類型的結構辦法,子類復寫的其調用的Designated結構辦法後會被自動承繼。
3.假如父類中的結構辦法是required修飾的,則子類必需停止承繼或復寫。
已經有冤家和我埋怨,Objective-C中的承繼是一種非常不獸性,它強迫子類承繼一切父類的辦法與屬性無論子類能否需求,剖析下面的一些規則可以發現,Swift與Objective-C相比,在結構辦法方面語法會愈加嚴厲,這樣做在編程上愈加平安。在Objective-C中,子類將被強迫承繼一切父類的初始化辦法,這樣開發者在運用時經常會呈現疑惑,有時一個子類往往有特定的初始化辦法,僅僅經過父類的初始化辦法不可以正確的完成初始化,在編程時,往往需求特殊正文來提示開發者。Swift設定的這些結構辦法准繩可以將有關的父類結構辦法剔除在外,在編程時愈加嚴厲平安,增加疑惑與不可控要素。
五、結構辦法的完成准繩
無論Designated類型的結構辦法還是Convenience類型的結構辦法,只需其有父類,最終都要完成父類的Designated結構辦法。Swift言語要求,在結構辦法中要完成一切成員常量或許變量的結構或賦值(optional值除外)。在對成員常量或變量停止結構賦值時,要在調用父類的初始化辦法之前,這裡還有一點需求留意,父類的成員屬性也會被子類承繼,假如要在子類復寫的父類辦法中對承繼來的父類成員屬性停止重新結構或賦值,則必需在調用父類結構辦法之後,例如創立ClassTwo類承繼於ClassOne,復寫辦法如下:
class ClassTwo: ClassOne { //子類自己的屬性 let tipTwo:Int override init() { //調用父類結構辦法行進行自己屬性的結構 tipTwo = 1 //調用父類結構辦法 super.init() //對從父類承繼來的屬性停止重結構 tip = 1000; } required init(three: Float) { fatalError("init(three:) has not been implemented") } }
Swift言語這種強迫化得結構規則,可以保證一個類在完成結構時,其外部的一切屬性都結構完成。在運用Objective-C停止開發時,很多初學者都能夠會遇到這樣一種狀況,完成了某個類的初始化,但向類的屬性停止賦值時卻沒有成功,由於Objective-C中並沒有這樣的語法,在類初始化成功後,其屬性能否初始化了完全取決於開發者,Swift優化了這一設計。
綜上可以理解,Swift言語雖然愈加嚴厲,卻將更多原本需求開發者留意的中央交由了編譯器,實踐上是加重了開發者的擔負。